注入就是格式化字符串漏洞的一种体现
例如我们在原本正常数据中进行了sql注入,破坏了原来的sql语句,从而执行了与原来语句不同的指令,达到攻击者的目的
模板注入
SSTI(服务器端模板注入)是格式化字符串的一个非常好的例子
SSTI的产生:
服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题.
补充:
单纯的字符串拼接并不能带来注入问题,关键要看你拼接的是什么,如果是控制语句,就会造成数据域与代码域的混淆,这样就会出洞
检测方法
同常规的 SQL 注入检测,XSS 检测一样,模板注入漏洞的检测也是向传递的参数中承载特定Payload 并根据返回的内容来进行判断的。每一个模板引擎都有着自己的语法,Payload 的构造需要针对各类模板引擎制定其不同的扫描规则,就如同 SQL注入中有着不同的数据库类型一样。
简单来说,就是更改请求参数使之承载含有模板引擎语法的Payload,通过页面渲染返回的内容检测承载的 Payload 是否有得到编译解析,有解析则可以判定含有 Payload 对应模板引擎注入,否则不存在SSTI。
SSTI 的检测工具 https://github.com/epinna/tplmap
攻击方向
(1)模板本身:
Smarty,Twig(2)框架本身:
Django,Flask/Jinja2,Tornado(3)语言本身:python,java
防御方法
(1)和其他的注入防御一样,绝对不要让用户对传入模板的内容或者模板本身进行控制
(2)减少或者放弃直接使用格式化字符串结合字符串拼接的模板渲染方式,使用正规的模板渲染方法