访问/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=来绕过。

⚪原理参考: