
Пошаговая демонстрация CVE-2021-29447 — уязвимости XXE в медиабиблиотеке WordPress, позволяющей утечку конфиденциальных файлов через специально созданные WAVE-загрузки, включая детали эксплуатации и устранения.
Пользователь, имеющий возможность загружать вредоносный WAVE-файл (например, автор), может воспользоваться проблемой синтаксического анализа XML в медиатеке WordPress, что приводит к XXE-атакам и может привести к раскрытию файловой системы.
Уязвимости XML External Entity (XXE)
XML позволяет определять пользовательские сущности, которые можно повторно использовать во всём документе. Это может, например, использоваться для избежания дублирования. Следующий код определяет сущность myEntity для дальнейшего использования.

Значение определённых сущностей также может поступать из внешнего источника, на который ссылается URI. В этом случае они называются внешними сущностями:

XXE-атаки используют эту возможность во вред. Если злоумышленник укажет file:///var/www/wp-config.php в качестве URI, он успешно получит содержимое конфиденциального файла. Атаки возможны, когда нестрого настроенный XML-парсер обрабатывает содержимое, контролируемое пользователем.
XXE в WordPress
WordPress имеет медиатеку, которая позволяет аутентифицированным пользователям загружать медиафайлы, впоследствии используемые в их записях блога. Для извлечения метаинформации из этих медиафайлов, например, имени исполнителя или названия, WordPress использует библиотеку getID3. Часть этих метаданных парсится в форме XML. Здесь была сообщена возможная XXE-уязвимость (строка 730).

Функция libxml_disable_entity_loader(true) была объявлена устаревшей, так как версии PHP 8 используют Libxml2 v2.9+, которая по умолчанию отключает выборку внешних сущностей.
Создайте вредоносный WAVE-файл с помощью следующей команды:

Создайте dtd-файл и добавьте в него этот код; это позволит вам извлечь wp-config.php, содержащий конфиденциальные данные, такие как учётные данные базы данных.

Теперь запустите HTTP-сервер.

Загрузите вредоносный .wav-файл в приложение WordPress. После загрузки .wav-файла вы должны увидеть следующий запрос в логах вашего HTTP-сервера. Обратите внимание: для эффективного извлечения данных используйте декодирование Zlib.

После этого вы получите учётные данные базы данных. Войдите в базу данных и попробуйте найти администратора.

corp-001 — это администратор. Взломайте его хеш пароля, затем войдите как администратор.

WordPress исправил уязвимость в версии 5.7.1, повторно введя вызов функции libxml_disable_entity_loader(), которая была объявлена устаревшей в PHP 8. Чтобы избежать предупреждений об устаревании PHP, в вызов был добавлен оператор подавления ошибок @.

https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/
https://nvd.nist.gov/vuln/detail/CVE-2021-29447
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-29447
https://github.com/motikan2010/CVE-2021-29447
https://www.youtube.com/watch?v=pkooNXGHl7c
https://www.youtube.com/watch?v=tE8Smz1Jvb8
https://www.mend.io/vulnerability-database/CVE-2021-29447