http://bmzclub.cn/challenges#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__);
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
shell_exec ( string $cmd ) : string
shell_exec()的执行效果和执行操作符反引号(``)是一样的
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
escapeshellarg ( string $arg ) : string
pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options。
pathinfo ( string $path , int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ) : mixed
basename — 返回路径中的文件名部分
basename ( string $path , string $suffix = ? ) : string
首先解决下这里的沙箱路径问题,这里没有将$sandbox
输出,所以需要自己计算出路径
$_SERVER["REMOTE_ADDR"]#是用户访问页面用的公网IP,百度输出IP直接搜索就能知道
最后的文件路径是:/sandbox/6dcb273e31b7c6e1cb3f2bb2b6b9236f/
Forbidden
就对了Not Found
就错了例如构造?url=/&filename=mochu.html
,然后访问/sandbox/6dcb273e31b7c6e1cb3f2bb2b6b9236f/mochu.html
然后当我尝试/?url=/flag&filename=flag.txt
然后再访问沙盒下的flag.txt