
PoC pour CVE-2021-2471 - XXE dans MySQL Connector/J
Vulnérabilité dans le produit MySQL Connectors d'Oracle MySQL (composant : Connector/J). Les versions prises en charge qui sont affectées sont 8.0.26 et antérieures.
Des attaques réussies de cette vulnérabilité peuvent entraîner un accès non autorisé à des données critiques ou un accès complet à toutes les données accessibles de MySQL Connectors, ainsi que la capacité non autorisée de provoquer un blocage ou un plantage fréquemment répétable (DOS complet) de MySQL Connectors.
Cette vulnérabilité a été découverte par Xu Yuanzhen de l'équipe de sécurité cloud d'Alibaba et Hongkun Chen d'Alibaba.
Ce PoC est fourni à des fins de recherche. Ne l'utilisez pas pour attaquer des cibles pour lesquelles vous n'avez pas l'autorisation explicite d'exploiter.
La divulgation et le correctif du fournisseur pour cette vulnérabilité peuvent être trouvés ici.
La vulnérabilité XXE consiste en un XML contenant des entités DTD malveillantes reçu par un composant MysqlSQLXML et est déclenchée lorsque la fonction getSource() est appelée.
Comme vu dans le code ci-dessous provenant de mysql-connector-java-8.0.26.jar, lorsque la classe DOMSource est donnée comme argument à la fonction getSource(), elle expose un DocumentBuilder de manière non sécurisée de sorte que, si un attaquant contrôle le contenu de l'InputSource passé au builder, il/elle pourrait l'exploiter pour obtenir une 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));
Il existe 2 façons de passer la XXE malveillante au MysqlSQLXML :
PoC XXE utilisant sqlxml.setString()
PoC XXE utilisant resultSet.getSQLXML()
Télécharger le JAR vulnérable
Autres charges utiles XXE