[MoeCTF 2021]地狱通讯

发布时间 2023-04-28 00:45:10作者: kode

[MoeCTF 2021]地狱通讯

首先看题:

from flask import Flask, render_template, request
from flag import flag, FLAG   //这里flag是一个全局变量
import datetime

app = 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