[HITCON 2017]SSRFme
开门见山,进入页面直接就给了php代码:
10.244.80.206 <?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
echo $_SERVER["REMOTE_ADDR"];
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox);
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);
highlight_file(__FILE__);
审计代码得知,前面返回了我的ip,与orange组合md5加密得到sandbox路径
路径为:/sandbox/2eeed2f9aeae6311b507ada8fb98809e/
通过url输入会以GET命令执行,执行了之后会被存到我们以filename命名的文件中,尝试读取根目录,并创建a文件:payload:/?url=/&filename=a,然后返回到路径中查看内容,发现了flag和readflag,应该是要通过readflag来读取flag
GET底层实使用的是open函数,open函数可以执行命令,简单来说我们如果要使用GET file:|id,就必须要满足id这个文件存在。我们需要执行/readflag,所以需要创建一个/readflag文件,构造payload:/?url=/&filename=|/readflag
然后利用file函数执行命令再次构造payload:/?url=file:|/readflag&filename=a,执行完之后再次返回路径中查看得到flag