
PoC for CVE-2021-2471 - XXE in MySQL Connector/J
Vulnerabilidade no produto MySQL Connectors da Oracle MySQL (componente: Connector/J). As versões suportadas que são afetadas são 8.0.26 e anteriores.
Ataques bem-sucedidos desta vulnerabilidade podem resultar em acesso não autorizado a dados críticos ou acesso completo a todos os dados acessíveis do MySQL Connectors e capacidade não autorizada de causar uma parada ou travamento repetível frequente (DOS completo) do MySQL Connectors.
Esta vulnerabilidade foi encontrada por Xu Yuanzhen da Equipe de Segurança da Nuvem Alibaba e Hongkun Chen da Alibaba.
Este PoC é fornecido para fins de pesquisa. Não o utilize para atacar alvos para os quais você não tenha permissão explícita para explorar.
A divulgação e a correção do fornecedor para esta vulnerabilidade podem ser encontradas aqui.
A vulnerabilidade XXE consiste em um XML contendo Entidades DTD maliciosas sendo recebido por um componente MysqlSQLXML e é acionada quando a função getSource() é chamada.
Como visto no código abaixo do mysql-connector-java-8.0.26.jar, quando a classe DOMSource é fornecida como argumento para a função getSource(), ela expõe um DocumentBuilder de forma insegura de modo que, se um invasor controlar o conteúdo do inputSource passado para o builder, ele/ela pode aproveitar isso para obter 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));
Existem 2 maneiras de passar o XXE malicioso para o MysqlSQLXML:
PoC XXE usando sqlxml.setString()
PoC XXE usando resultSet.getSQLXML()
Baixar JAR vulnerável
Outros Payloads XXE