
PoC para CVE-2021-2471 - XXE en MySQL Connector/J
Vulnerabilidad en el producto MySQL Connectors de Oracle MySQL (componente: Connector/J). Las versiones compatibles afectadas son 8.0.26 y anteriores.
Los ataques exitosos de esta vulnerabilidad pueden resultar en acceso no autorizado a datos críticos o acceso completo a todos los datos accesibles de MySQL Connectors, así como la capacidad no autorizada de causar un bloqueo o un fallo frecuentemente repetible (DOS completo) de MySQL Connectors.
Esta vulnerabilidad fue encontrada por Xu Yuanzhen del equipo de seguridad de Alibaba Cloud y Hongkun Chen de Alibaba.
Este PoC se proporciona con fines de investigación. No lo uses para atacar objetivos que no tengas permiso explícito para explotar.
La divulgación y el parche del proveedor para esta vulnerabilidad se pueden encontrar aquí.
La vulnerabilidad XXE consiste en un XML que contiene entidades DTD maliciosas recibidas por un componente MysqlSQLXML y se activa cuando se llama a la función getSource().
Como se ve en el código siguiente de mysql-connector-java-8.0.26.jar, cuando la clase DOMSource se pasa como argumento a la función getSource(), expone un DocumentBuilder de forma insegura, de modo que si un atacante controla el contenido de inputSource pasado al constructor, podría aprovecharlo para obtener XXE:
public <T extends Source> T getSource(Class<T> clazz) throws SQLException {
try {
this.checkClosed();
this.checkWorkingWithResult();
InputSource reader;
if (clazz != null && !clazz.equals(SAXSource.class)) {
SQLException sqlEx;
if (clazz.equals(DOMSource.class)) {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
if (this.fromResultSet) {
inputSource = new InputSource(this.owningResultSet.getCharacterStream(this.columnIndexOfXml));
} else {
inputSource = new InputSource(new StringReader(this.stringRep));
}
return new DOMSource(builder.parse(inputSource));
Hay 2 formas de pasar el XXE malicioso al MysqlSQLXML:
PoC XXE usando sqlxml.setString()
PoC XXE usando resultSet.getSQLXML()
Descargar JAR vulnerable
Otros payloads XXE