SSTI模板注入汇总


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

TWIG 全版本 通用 SSTI payload

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

待填坑


Author: kingkb
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source kingkb !
Copyright © 2022-2023 kingkb | Powered by Hexo | Theme Matery
  Total Words: 73.7k  |  Total visits:   |  Total visitors: