SSTI模板注入汇总
参考服务端模板注入攻击
之前做了很多SSTI模板注入的题目,但是做起题来还是云里雾里,打算做个小汇总。
探测漏洞
漏洞一般出现在这两种情况下,而每种有不同的探测手法:
文本类
大部分的模板语言支持我们输入 HTML,比如:
smarty=Hello {user.name}
Hello user1
freemarker=Hello ${username}
Hello newuser
any=Hello
Hello
未经过滤的输入会产生 XSS,我们可以利用 XSS 做我们最基本的探针。除此之外,模板语言的语法和 HTML 语法相差甚大,因此我们可以用其独特的语法来探测漏洞。虽然各种模板的实现细节不大一样,不过它们的基本语法大致相同,我们可以发送如下 payload:
smarty=Hello ${7*7}
Hello 49
freemarker=Hello ${7*7}
Hello 49
来确认漏洞。
代码类
在一些环境下,用户的输入也会被当作模板的可执行代码。比如说变量名:
personal_greeting=username
Hello user01
这种情况下,XSS 的方法就无效了。但是我们可以通过破坏 template 语句,并附加注入的HTML标签以确认漏洞:
personal_greeting=username
Hello
personal_greeting=username} }
Hello user01
判断
检测到模板注入后,我们需要判断具体的模板引擎。我们需要 fuzz 不同的字符,再通过返回的错误判断。当模板引擎屏蔽错误后,该类当法就失效了,并且暴力 fuzz 也对攻击自动化不友好。Burpsuite 则对不同模板接受的 payload 做了一个分类,并以此快速判断模板引擎:
有些时候,同一个可执行的 payload 会在不同引擎中返回不同的结果,比方说{ {7*'7'} }会在 Twig 中返回49,而在 Jinja2 中则是7777777。
常见的模板及其payload
TWIG
Jimja2
待填坑
flask
http://kingkb.top/2022/01/18/%E9%95%BF%E5%AE%89%E6%88%98%E7%96%ABweb-flask%E5%A4%8D%E7%8E%B0/
Mako
待填坑
Jade
待填坑
Velocity
待填坑
Freemaker
待填坑
smarty
待填坑