
CVE-2021-2471용 PoC - MySQL Connector/J의 XXE
Oracle MySQL의 MySQL Connectors 제품(구성 요소: Connector/J)의 취약점입니다. 영향을 받는 지원 버전은 8.0.26 및 이전 버전입니다.
이 취약점을 성공적으로 악용하면 중요한 데이터에 대한 무단 액세스 또는 MySQL Connectors에서 액세스할 수 있는 모든 데이터에 대한 완전한 액세스가 가능해지고, MySQL Connectors를 정지시키거나 빈번하게 반복되는 충돌(완전한 DoS)을 유발하는 무단 기능을 수행할 수 있습니다.
이 취약점은 Alibaba Cloud Security Team의 Xu Yuanzhen과 Alibaba의 Hongkun Chen에 의해 발견되었습니다.
이 PoC는 연구 목적으로 제공됩니다. 명시적 허가 없이 악용할 대상에 대해 공격에 사용하지 마십시오.
공급업체의 공개 및 수정 사항은 여기에서 확인할 수 있습니다.
XXE 취약점은 MysqlSQLXML 구성 요소가 수신하는 악성 DTD 엔티티를 포함하는 XML로 구성되며, 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));
MysqlSQLXML에 악성 XXE를 전달하는 방법에는 2가지가 있습니다:
sqlxml.setString()을 사용하는 PoC XXE
resultSet.getSQLXML()을 사용하는 PoC XXE
취약한 JAR 다운로드
기타 XXE 페이로드