访问/public/目录,只有一张图片(www.jpg)。

经测试存在www.zip源码泄露,发现是ThinkPHP 6.0,app/controller/Index.php的代码如下:

<?php
namespace app\controller;
use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        
        echo "<img src='../test.jpg'"."/>";
        $paylaod = @$_GET['payload'];
        if(isset($paylaod))
        {
            $url = parse_url($_SERVER['REQUEST_URI']);
            parse_str($url['query'],$query);
            foreach($query as $value)
            {
                if(preg_match("/^O/i",$value))
                {
                    die('STOP HACKING');
                    exit();
                }
            }
            unserialize($paylaod);
        }
    }
}

parse_url函数会解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

既然不让以“O”开头,那就构造不合格的url来绕过parse_url。对于严重不合格的url它会返回false。

<?php
error_reporting(0);
$url = 'http://baidu.com///public/?payload=o';
var_dump(parse_url($url));

返回:

array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "baidu.com"
["path"]=>
string(10) "///public/"
["query"]=>
string(9) "payload=o"
}

后面需要用到thinkphp v6.0.x 反序列化RCE。使用工具:戳我

url用///public/?payload=来绕过。

⚪原理参考:

https://xz.aliyun.com/t/6479

https://www.freebuf.com/column/221939.html

https://hack-for.fun/posts/580c.html