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

⚪原理参考: