
استغلال لـ CVE-2026-8181 - تجاوز المصادقة في إضافة Burst Statistics لووردبريس
استغلال لـ CVE-2026-8181 تم اكتشافه بواسطة كلوي تشامبرلاند و PRISM.
هذا المستودع مقدم لأغراض البحث والأمن الدفاعي فقط. المؤلف لا يتحمل أي مسؤولية عن سوء استخدام هذه المعلومات.
إضافة Burst Statistics – Privacy-Friendly WordPress Analytics الخاصة بووردبريس معرضة لـ تجاوز المصادقة يؤدي إلى تصعيد صلاحيات المدير في الإصدارات 3.4.0 إلى 3.4.1.1.
الثغرة موجودة في طريقة is_mainwp_authenticated() في وكيل MainWP الخاص بالإضافة، والتي تعالج بشكل غير صحيح أي قيمة إرجاع غير WP_Error من wp_authenticate_application_password() على أنها مصادقة ناجحة.
يسمح هذا للمهاجمين غير المصادقين الذين يعرفون اسم مستخدم مدير صالح بانتحال شخصية ذلك المدير طوال مدة أي طلب REST API، بما في ذلك نقاط نهاية ووردبريس الأساسية مثل POST /wp-json/wp/v2/users. بيانات اعتماد المدير الحالي لا تتعرض للخطر أبدًا، لكن المهاجم يحصل على صلاحياته لفترة كافية لإنشاء حساب مدير جديد تمامًا.
سلسلة الثغرة هي كما يلي:
includes/class-burst.php:41 -> تقوم الإضافة بتسجيل init() على plugins_loaded بأولوية 9، والذي يشغل bootstrap() ويستدعي has_admin_access() لكل طلب (بما في ذلك REST).
includes/Traits/trait-admin-helper.php:202 -> عندما يحمل الطلب الرأس X-BurstMainWP: 1، يقوم has_admin_access() بإنشاء مثيل لـ MainWP_Proxy ويفوض المصادقة إلى is_mainwp_authenticated().
includes/Frontend/class-mainwp-proxy.php:314 -> تقرأ الطريقة رأس Authorization، وتفك تشفير بيانات الاعتماد الأساسية وترسل / التي قدمها المهاجم إلى الدالة الأساسية لووردبريس .
وبالتالي، فإن طلب HTTP واحد بكلمة مرور مزيفة كافٍ لانتحال شخصية أي مدير على مستوى REST API الأساسي لووردبريس.
الإضافة النشطة — يشير HTML الصفحة الرئيسية إلى أصولها فقط عند تفعيل الإضافة:
echo http://127.0.0.1:8000 | httpx -silent -mr '/wp-content/plugins/burst-statistics/'
الإصدار — يتم تقديم readme.txt بشكل ثابت ويكشف عن الإصدار المثبت (الضعيف: 3.4.0–3.4.1.1، المصحح: 3.4.2+):
echo http://127.0.0.1:8000 | httpx -silent -path /wp-content/plugins/burst-statistics/readme.txt -er 'Stable tag:\s*[0-9][0-9a-zA-Z.\-]*'
قالب CVE-2026-8181.yaml المرفق مع nuclei يقوم بأتمتة كلا الفحصين ومقارنة الإصدارات:
nuclei -t CVE-2026-8181.yaml -u http://127.0.0.1:8000
بمجرد اكتشاف إصدار ضعيف من الإضافة، يتطلب الاستغلال معرفة اسم مستخدم مدير صالح. يقوم REST API الخاص بووردبريس بتسريبها في معظم التثبيتات من خلال نقطة نهاية المستخدمين العامة:
echo http://127.0.0.1:8000 | httpx -silent -path '/wp-json/wp/v2/users' -er '"slug":"[^"]+"'
عندما يتم تأمين نقطة النهاية تلك (مثل بواسطة تعطيل REST API أو إيقاف تعداد المستخدمين)، فإن خدعة أرشيف المؤلف (/?author=N) عادة ما تظل تسرب اسم المستخدم عبر إعادة التوجيه إلى /author/<username>/.
مع وجود اسم مستخدم صالح، يقوم الاستغلال بإنشاء حساب مدير جديد في طلب واحد:
تثبيت تبعيات بايثون:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
تشغيل الاستغلال ضد الهدف، مع توفير اسم مستخدم مدير معروف باستخدام -u:
venv/bin/python3 CVE-2026-8181.py -t http://127.0.0.1:8000 -u admin
مثال على المخرجات:
[2026-05-16] [12:20:20] [info] [config] Impersonating admin='admin', will create new admin 'pwn_322a4903' / 'kS8D^2A^P^%UtWyuUS3p8%64' ([email protected]).
[2026-05-16] [12:20:21] [success] [http://127.0.0.1:8000] Authentication bypass successful — new administrator created: username='pwn_322a4903' password='kS8D^2A^P^%UtWyuUS3p8%64'
تسجيل الدخول إلى /wp-admin/ باستخدام حساب المدير المنشأ حديثًا.
يعمل التجاوز فقط إذا وصل رأس Authorization إلى PHP عبر $_SERVER['HTTP_AUTHORIZATION']. على Apache + mod_php مع روابط دائمة عادية (الافتراضي لووردبريس خارج الصندوق)، لا يتم إنشاء .htaccess ويتم حذف الرأس بصمت — لا يمكن للاستغلال النجاح.
التبديل إلى أي رابط دائم غير عادي في الإعدادات → الروابط الدائمة يجعل ووردبريس 5.6+ يكتب التوجيه RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] في .htaccess، مما يستعيد التوجيه. Nginx + PHP-FPM و LiteSpeed يوجّهون Authorization افتراضيًا بغض النظر عن الروابط الدائمة. الروابط الدائمة الجميلة هي المعيار لتحسين محركات البحث في الإنتاج، وهذا هو سبب تصنيف هذه الثغرة بـ CVSS 9.8 غير مصادق.
يحاول الاستغلال /wp-json/wp/v2/users أولاً ثم يتراجع إلى /index.php?rest_route=/wp/v2/users لذا فإن توجيه نقطة النهاية ليس هو العائق أبدًا — فقط توجيه الرأس هو العائق.
usernamepasswordwp_authenticate_application_password()includes/Frontend/class-mainwp-proxy.php:328-329 -> يتم فحص القيمة المُرجعة فقط باستخدام is_wp_error(). تعيد ووردبريس الأساسية $input_user غير المعدل (هنا null) عندما لا تكون كلمات مرور التطبيق قيد الاستخدام أو عندما لا يتم وضع علامة على الطلب كطلب API. عند plugins_loaded بأولوية 9، لم يقم REST API بعد بتعيين الفلتر application_password_is_api_request إلى true، لذا فإن الشرط الثاني يتحقق دائمًا عند تشغيل التعليمات البرمجية الضعيفة — و null ليس WP_Error، لذا يمر الحارس.
includes/Frontend/class-mainwp-proxy.php:336 -> يتم استدعاء wp_set_current_user( $user->ID ) مع المستخدم الذي تم البحث عنه فقط من اسم المستخدم الذي قدمه المهاجم، مما يحدد المستخدم المصادق عالميًا للطلب بأكمله.