攻防世界 web进阶区 shrine

攻防世界 web进阶区 shrine

打开这个题目,看到的是python的flask框架代码审计
在这里插入图片描述
整理一下得到如下代码

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 
    return flask.render_template_string(safe_jinja(shrine)) 
if __name__ == '__main__': 
    app.run(debug=True)

其中可以看到有两个访问路由,“/”和“/shrine/”,在“/”路由中,显示了当前文件的内容,重点在第二个路由中,其中replace()方法将“(”和“)”都替换为了空
对“config”和“self”这两个关键词进行了禁用。
代码审计先到这里,看看实际操作。
直接打开/shrine/这个路由看看,结果发现并没有找到改网页
攻防世界 web进阶区 shrine_第1张图片
即使没有找到这个网页,因为代码审计中确实又有这个路由,那就直接测试有没有flak的漏洞利用构造{{2*3}}看看结果,果然存在注入点。
攻防世界 web进阶区 shrine_第2张图片
{{config}}就不要想了,因为已经对其进行了过滤,这样的话,我们就使用全局变量进行沙盒逃逸。构造payload:{{url_for.__globals__}}得到如下结果,这就说明了全局变量是可以使用的。
攻防世界 web进阶区 shrine_第3张图片
如此的话,我们就可以使用current_app这是全局变量代理,查看他的config即可,构造payload:{{url_for.__globals__['current_app'].config}},得到相关的配置信息。同时得到flag相关信息。
在这里插入图片描述
同时可以直接方问flag配置项,构造的payload为:{{url_for.__globals__['current_app'].config[FLAG']}}
攻防世界 web进阶区 shrine_第4张图片
最终得到flag为:flag{shrine_is_good_ssti}
以上就是关于本题的相关解题思路了,如有不对,请各位路过的大佬指正吧。

你可能感兴趣的:(ctf,web题,flask,python,web安全)