ssti漏洞
ssti漏洞
模板引擎
模板引擎是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档。模板引擎将预先定义的标签字符替换为指定的业务数据,或者根据某种定义好的流程进行输出。
模板引擎可以使html的数据处理更加便捷、高效
模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过。
SSTI
SSTI就是服务器端模板注入(Server-Side Template Injection),通过与服务端模板的输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或者执行命令的目的。
凡是使用模板的地方都可能会出现SSTI的问题,SSTI不属于任何一种语言。
现在web主流使用的一些框架,比如python的flask,php的thinkphp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
漏洞原理
服务端接收了用户的恶意输入以后,未经处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,用户精心构造的攻击语句插入了模板中,进行了语句的拼接,web端执行了所插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、代码执行等问题。
常见的模板引擎
- python:jinja2、mako、tornado
- php:smarty、twig
- java:jade、velocity、Thymeleaf
模板漏洞
python
tornado
见的比较少,待补充
Mako
遇到了再学习吧,贴个链接
https://sechub.in/view/2512595
jinjia2
flask中默认的模板引擎是jinja2
flask有两种渲染方式
render_template()用于渲染文件render_template_string()用于渲染字符串
ssti主要与render_template_string()这种方式有关。
jinja2使用{{name}}结构表示一个变量,它是一种特殊的占位符,告诉模版引擎这个位置的值从渲染模版时使用的数据中获取。jinja2
模板同样支持控制语句{%…%}
由于在jinja2中是可以直接访问python的一些对象及其方法的,所以可以通过构造继承链来执行一些操作,比如文件读取,命令执行等
常用方法
1 | |
看一个常见payload的利用过程
1 | |
解释:
1 | |
常见的利用子类以及模块
重载过的__init__类的类有__globals__属性,用__builtins__来查看引用会返回很多dict,找到能利用的
任意文件读取
python2
<type 'file'>
1 | |
python3
_frozen_importlib模块
1 | |
click.utils.LazyFile模块
1 | |
命令执行
python2
site模块
1 | |
warnings类中的linecache
1 | |
python3
subprocess.Popen模块
1 | |
_frozen_importlib模块
1 | |
os模块
1 | |
寻找可用的子类
1 | |
更多类与模块参考
绕过
过滤点号.
1 | |
过滤中括号[]
1 | |
过滤关键字
1 | |
过滤单双引号'/"
1 | |
过滤了双花括号
1 | |
过滤__init__
1 | |
Flask中的特殊方法
1 | |
特殊字符全过滤
考虑构造字符
int(): 将值转换为int类型 list(): 将变量列成列表 string(): 将变量转换成字符串 join(): 将一个序列中的参数值拼接成字符串 length(): 返回字符串的长度,别名是count
1 | |
php
Smarty
确认版本号(注入点)
1 | |
通用版本
1 | |
旧版本
1 | |
Smarty3以上
1 | |
CVE-2021-26120
1 | |
CVE-2021-26119
1 | |
CVE-2021-29454
1 | |
java
待补充
https://0314valen.github.io/article/2021-11-23-%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5(ssti)
参考
https://misakikata.github.io/2020/04/python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E4%B8%8ESSTI/
https://chenlvtang.top/2021/03/31/SSTI%E8%BF%9B%E9%98%B6/
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection
https://xz.aliyun.com/t/11108