
PoC для CVE-2021-2471 - XXE в MySQL Connector/J
Уязвимость в продукте MySQL Connectors от Oracle MySQL (компонент: Connector/J). Затронутые поддерживаемые версии: 8.0.26 и более ранние.
Успешные атаки на эту уязвимость могут привести к несанкционированному доступу к критическим данным или полному доступу ко всем данным, доступным через MySQL Connectors, а также к несанкционированной возможности вызвать зависание или часто повторяющийся сбой (полный отказ в обслуживании) MySQL Connectors.
Эта уязвимость была обнаружена Сюй Юаньчжэнем из команды безопасности Alibaba Cloud и Хункунем Ченом из Alibaba.
Этот PoC предоставлен в исследовательских целях. Не используйте его для атак на цели, на которые у вас нет явного разрешения.
Раскрытие информации вендором и исправление этой уязвимости можно найти здесь.
Уязвимость XXE заключается в том, что XML, содержащий вредоносные сущности DTD, принимается компонентом MysqlSQLXML и срабатывает при вызове функции getSource().
Как видно из приведенного ниже кода из mysql-connector-java-8.0.26.jar, когда класс DOMSource передается в качестве аргумента функции getSource(), он небезопасным образом открывает DocumentBuilder, так что если злоумышленник контролирует содержимое inputSource, переданного сборщику, он может использовать это для получения 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));
Существует 2 способа передать вредоносный XXE в MysqlSQLXML: