Python模板注入

Python模板注入

近期遇到Python模板注入问题,故在此整理,便于后期回顾。html

1 什么是“模板注入”

  首先什么是“Python模板”呢?Python有不少模板引擎能够帮助咱们构建完善的Web应用程序。这里将要讨论的就是jinja2。而“模板注入”就是在模板中注入特定的代码,这里的模板多是文件,也多是字符串。python

2 简单的例子

在Jinja2中,使用{%...%}执行for循环或赋值语句,使用{{...}}把表达的结果打印到模板上。更具体的内容可直接查看Jinja2中文文档flask

  1. 先搭建Flask虚拟环境,进入Scripts中,建立template.py。再也不赘述,详细步骤在Flask
# template.py
from flask import
from flask import Flask, request

app = Flask(__name__)

def exp():
    input = request.args.get('input')
    result = Template("This is {{thing}}")
    return result.render(thing=input)
  1. {{}}看出,这里的thing就是一个变量,咱们能够在url中能够将期待的值输入到input交给flask给到thing渲染。可是这里的thing就是个字符串,若是传入表达式,它并不能作出相应的执行。
    1app

  2. 对代码进行如下修改,发现表达式被执行url

from jinja2 import Template
from flask import Flask, request

app = Flask(__name__)

@app.route('/')

def exp():
    input = request.args.get('input')
    result = Template("This is " + input)
    return result.render()

2

3 如何利用这个漏洞作更多的事呢

咱们拿到这个漏洞天然想要更多的权限对系统或文件进行操做,这须要利用Python的特性,Python能够利用os或subprocess模块执行系统命令。code

  1. 那咱们怎么找到os模块呢?
    能够利用[].__class__随便肯定一个类,.__class__前面的这个[]一样能够换成''""等。由于咱们的目的是肯定基类。
    classorm

  2. 那基类怎么找呢?[].__class__.__base__
    htm

  3. 找到基类了,就完成了第一步,接下来,咱们须要知道其直接子类的弱引用列表,方便咱们找到os模块。那这个直接子类的弱引用列表怎么找呢?[].__class__.__base__.__subclasses__()。下图仅做示意
    subclassesblog

  4. 为了更好的理解这个问题,仍是借助攻防世界的题目Web_python_template_injection来作模板引擎

· 在题目场景连接后加上/{{[].__class__.__base__.__subclasses__()}}便可查看列表
xctf

· 如何从这个列表中,找到os相关的类?
穷举这个列表,若是os列表元素.__init__.__globals__中,就print该元素及其位置。剩下的之后再补充吧。。

References

https://www.freebuf.com/column/187845.html
https://docs.python.org/release/3.8.3/library/stdtypes.html#special-attributes

相关文章
相关标签/搜索