
عرض توضيحي تعليمي لاستغلال CVE-2024-12877 لثغرة حقن كائنات PHP في إضافة GiveWP ووردبريس. يتضمن تحليل السبب الجذري، وتقنيات تجاوز regex، وممارسات الاستغلال الآمنة.
الأسبوع 66 | المؤلف: علي سلطاني (soltanali0)
مرحبًا بكم في الأسبوع 66 من سلسلة GO-TO CVE، حيث نقوم بتشريح الثغرات الأمنية، وتحليل الأسباب الجذرية، وعرض تقنيات الاستغلال العملية في سياق تعليمي آمن.
CVE-2024-12877 هي ثغرة حقن كائنات PHP (PHP Object Injection) في GiveWP، أحد أكثر إضافات التبرع لووردبريس استخدامًا. الاستخدام غير الآمن لدالة unserialize() على مدخلات يتحكم فيها المستخدم يسمح للمهاجمين باستدعاء دوال PHP السحرية (مثل __wakeup())، مما قد يؤدي إلى:
CVSS: 9.8 حرج | المتجه: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
يدعم GiveWP آلاف المواقع الخيرية والمنظمات غير الحكومية ومنصات جمع التبرعات. ولأنه يتعامل مع بيانات مالية وبيانات مانحين حساسة، فإن وجود ثغرة هنا له تأثير بالغ. يمكن للمهاجم الذي يستغل حقن الكائنات أن يتصاعد من إضافة واحدة إلى اختراق تثبيت ووردبريس بالكامل والخادم الأساسي.
السبب الجذري: استخدام unserialize() على مدخلات غير موثوقة.
دوال PHP السحرية: تستدعيها PHP تلقائيًا خلال دورة حياة الكائن:
تنبع الثغرة من الاستخدام غير الآمن لدالة PHP unserialize() على مدخلات يتحكم فيها المستخدم. وبينما صُممت unserialize() لإعادة بناء هياكل بيانات PHP، فإن لها تأثيرًا جانبيًا خطيرًا: عندما يتم إعادة بناء الكائنات، تستدعي PHP تلقائيًا الدوال السحرية.
__wakeup() – تُستدعى عند إلغاء تسلسل كائن
__destruct()، __toString()، __get/__set()، __call/__callStatic() – يمكن استغلالها للتنفيذ الخبيث
تحقق Regex: نفذت GiveWP فحوصات regex لاكتشاف المدخلات المسلسلة. وعلى الرغم من أن regex الجديد يلتقط المزيد من أنواع البيانات، لا يمكن لـ regex منع حقن الكائنات بشكل موثوق.
باستخدام كائن مسلسل ومُصمم بعناية، يضبط المهاجم خصائص الكائن، وتقوم PHP نفسها بتنفيذ منطق المهاجم من خلال استدعاء الدوال السحرية
نفذت GiveWP تحققًا قائمًا على regex لمعرفة ما إذا كان الإدخال مسلسلًا. Regex القديم (غير مكتمل)
• كان يتعرف فقط على المصفوفات والكائنات.
• الأنواع المسلسلة الأخرى (سلسلة، عدد صحيح، منطقي، عائم، null) كانت تتجاوز الاكتشاف.
• يتعرف على جميع أنواع PHP المسلسلة.
• يحظر بعض الحمولات التافهة.
• لكن المشكلة الأساسية تبقى: إذا تم استخدام unserialize() على إدخال المستخدم، فإن regex لن ينقذك.
كُتب هذا المقتطف لمقارنة تطبيقين مختلفين لـ regex:
• is_serialized_old() → الإصدار القديم، الذي يكتشف المصفوفات والكائنات فقط.
• is_serialized_new() → الإصدار المحسّن، الذي يتعرف على جميع أنواع بيانات PHP المسلسلة (المصفوفات، الكائنات، السلاسل، الأعداد الصحيحة، القيم المنطقية، الأعداد العائمة، و null). ننشئ مجموعة من قيم الاختبار (مصفوفة، كائن، سلسلة، عدد صحيح، منطقي، عائم، null)، ثم نسلسلها، ونفحص كل واحدة مقابل دالتي regex. بعبارات بسيطة:
وبعد تشغيل هذا الكود على حاوية Docker الخاصة بك، سترى هذه النتيجة في المتصفح
الخطوة 1
الخطوة 2: إنشاء كلاس ضعيف
يحتوي هذا الكلاس على دالة __wakeup() سيتم تنفيذها تلقائيًا عند إلغاء التسلسل.
الخطوة 3: صياغة الحمولة
الخطوة 4: الإخراج بعد حفظ الملف، يمكنك رؤية هذا الاستغلال في هذا الملف
الاستغلال :
• Regex القديم: FALSE ← فشل في اكتشاف الحمولة.
• Regex الجديد: TRUE ← اكتشفها كمدخل مسلسل.
• التنفيذ: Hello RCE! ← تم إلغاء تسلسل الحمولة، ونفّذت الدالة السحرية __wakeup() كودًا يتحكم به المهاجم.
الوقاية
• لا تستخدم unserialize() على مدخلات غير موثوقة. استبدلها بـ json_decode() أو بدائل أكثر أمانًا.
• حافظ على تحديث GiveWP وجميع إضافات ووردبريس.
• انشر جدار حماية لتطبيقات الويب (WAF) لحظر الحمولات المسلسلة الخبيثة.
• اتبع مبدأ الامتياز الأقل: شغّل PHP وحسابات قاعدة البيانات بأقل الصلاحيات المطلوبة.
النتائج:
الرؤية الأساسية: لا تعتمد أبدًا على regex لتأمين
unserialize(). الطريقة الأكثر أمانًا هي تجنب إلغاء تسلسل المدخلات غير الموثوقة تمامًا.
unserialize() على مدخلات غير موثوقة؛ فضّل json_decode() أو بدائل آمنة أخرى.أدير قناتين على تيليغرام مخصصتين لأبحاث واستغلال الثغرات:
GO-TO CVE الحلقات الأسبوعية: كل أسبوع، نغوص في عمق ثغرة CVE جديدة ونشارك تحليلًا مفصلاً وعروضًا ورؤى. 🔗 انضم إلينا هنا
CVEdb – أرشيف الاستغلالات: تؤرشف هذه القناة استغلالات اليوم الأول (1-day exploits) وPoCs مخصصة للثغرات. مصدر رائع للباحثين الذين يريدون رؤية تقنيات الاستغلال النشطة. 🔗 انضم إلى CVEdb
تابع القناتين للبقاء على اطلاع بأحدث الثغرات وتقنيات الاستغلال ورؤى أبحاث الأمن.
هذا المستودع مخصص لأغراض تعليمية وبحثية فقط. استغلال الثغرات بدون إذن غير قانوني وغير أخلاقي. المؤلف ليس مسؤولًا عن إساءة الاستخدام.