【MoeCTF 2021】地狱通讯

题目

from flask import Flask, render_template, request
from flag import 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()

思路

关键代码分析:

  1. flAg = FLAG(f1ag):用户提供的f1ag参数被传入FLAG函数处理,假设当参数不正确时返回一个对象实例。

  2. message = "Your flag is {0}" + exp:将用户输入的exp拼接到字符串中,形成新的格式化字符串。

  3. return message.format(flAg):使用flAg作为参数进行格式化,若exp包含格式化占位符,可触发二次格式化,访问对象属性。

Payload解析:

  • ?f1ag=1&exp={0.__class__.__init__.__globals__}

  • f1ag=1:传入错误参数使FLAG函数返回一个对象实例(如错误对象)。

  • exp构造为{0.__class__.__init__.__globals__},利用属性链访问:

    • __class__:获取flAg对象的类。

    • __init__:获取类的构造函数方法。

    • __globals__:获取构造函数所在模块的全局变量字典,其中可能包含flag变量。

漏洞利用过程:

  1. 拼接格式化字符串message变为"Your flag is {0}{0.__class__.__init__.__globals__}"

  2. 格式化触发属性访问flAg作为第一个参数替换{0},第二个占位符访问其属性链,最终获取到模块全局变量。

  3. 泄露全局变量:全局变量字典中包含flagFLAG,响应中返回该字典内容,暴露真实flag。

EXP

 ?f1ag=1&exp={0.__class__.__init__.__globals__}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值