
PoC per CVE-2021-2471 - XXE in MySQL Connector/J
Vulnerabilità nel prodotto MySQL Connectors di Oracle MySQL (componente: Connector/J). Le versioni supportate interessate sono 8.0.26 e precedenti.
Attacchi riusciti di questa vulnerabilità possono comportare accesso non autorizzato a dati critici o accesso completo a tutti i dati accessibili tramite MySQL Connectors e capacità non autorizzata di causare un blocco o un crash frequentemente ripetibile (DOS completo) di MySQL Connectors.
Questa vulnerabilità è stata trovata da Xu Yuanzhen del team Alibaba Cloud Security e Hongkun Chen di Alibaba.
Questo PoC è fornito a scopo di ricerca. Non usarlo per attaccare obiettivi che non hai il permesso esplicito di sfruttare.
La divulgazione e la correzione di questa vulnerabilità da parte del fornitore sono disponibili qui.
La vulnerabilità XXE consiste in un XML contenente entità DTD dannose ricevuto da un componente MysqlSQLXML e viene attivata quando viene chiamata la funzione getSource().
Come si vede nel codice seguente tratto da mysql-connector-java-8.0.26.jar, quando la classe DOMSource viene passata come argomento alla funzione getSource(), espone un DocumentBuilder in modo non sicuro, così che, se un attaccante controlla il contenuto di inputSource passato al builder, può sfruttarlo per ottenere 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));
Esistono 2 modi per passare la XXE dannosa a MysqlSQLXML:
PoC XXE usando sqlxml.setString()
PoC XXE usando resultSet.getSQLXML()
Scarica il JAR vulnerabile
Altri payload XXE