Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-7384 — استغلال PoC وتحليل السبب الجذري لحقنة كائنات PHP حرجة غير مصادق عليها في WordPress Database for Contact Form 7، مما يؤدي إلى RCE عبر حذف ملفات تعسفي. | Kitploit
أدوات/GitHubGitHub/dungsocool/cve-2025-7384
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبالتعلم والتعليممختبرات وتدريب عملي
GitHubdungsocool/cve-2025-7384

CVE-2025-7384

استغلال PoC وتحليل السبب الجذري لحقنة كائنات PHP حرجة غير مصادق عليها في WordPress Database for Contact Form 7، مما يؤدي إلى RCE عبر حذف ملفات تعسفي.

عرض المستودع
12منذ 2 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2025-7384 — حقن كائنات PHP المؤدي إلى تنفيذ الأوامر عن بُعد (RCE)

الملحق: Database for Contact Form 7 (contact-form-entries) ≤ 1.4.3
CVSS: 9.8 (حرج)
CWE: CWE-502 — إلغاء تسلسل بيانات غير موثوقة
متطلبات المصادقة: لا شيء (بدون مصادقة)
الأثر: تنفيذ الأوامر عن بُعد


جدول المحتويات

  1. نظرة عامة على الثغرة
  2. مفاهيم ذات صلة
  3. تحليل السبب الجذري (الكود المصدري + التصحيح)
  4. سلسلة الهجوم
  5. إعادة الإنتاج خطوة بخطوة (POC)
  6. تقييم الأثر
  7. إجراءات المعالجة

1. نظرة عامة على الثغرة

يحتوي الملحق "Database for Contact Form 7" (المعرّف: contact-form-entries) الإصدار 1.4.3 وما دون على ثغرة حقن كائنات PHP. عندما يعرض مدير ووردبريس سجل نموذج (إدخال) داخل لوحة الإدارة، يستدعي الملحق الدالة maybe_unserialize() مباشرة على بيانات أرسلها مستخدم غير مصادق عبر Contact Form 7، دون التحكم في قائمة الفئات المسموح بإنشائها.

لا يحتاج المهاجم إلى تسجيل الدخول — بل يكفي أن يقدم نموذج اتصال عادي مع إدراج كائن PHP متسلسل في أي حقل من حقول النموذج. تُخزَّن هذه البيانات خامًا في قاعدة البيانات. عندما يفتح المدير عرض هذا الإدخال، تقوم دالة إلغاء التسلسل بإنشاء كائن من اختيار المهاجم، مما يؤدي إلى تشغيل دوال سحرية مثل __destruct() أو __wakeup() → تنفيذ سلوك تعسفي اعتمادًا على أدوات POP المتاحة في بيئة ووردبريس.

مستوى الخطورة: مع أداة POP مناسبة (على سبيل المثال، فئة تستدعي دالة __destruct() الخاصة بها unlink())، يمكن للمهاجم حذف ملف wp-config.php، مما يعيد ووردبريس إلى شاشة التثبيت الأولية → إعادة التثبيت بحساب مدير يتحكم فيه المهاجم → تثبيت ملحق يحتوي قشرة ويب → تحقيق تنفيذ كامل للأوامر عن بُعد (RCE) على الخادم.

السمةالقيمة
معرّف CVECVE-2025-7384
درجة CVSS9.8 (حرج)
CWECWE-502 — إلغاء تسلسل بيانات غير موثوقة
الملحق المتأثرcontact-form-entries (Database for Contact Form 7) ≤ 1.4.3
متطلبات المصادقةلا شيء — أي شخص يقدم نموذج CF7 يمكنه حقن الحمولة
شرط التفعيليعرض المدير الإدخال المحقون في لوحة الإدارة
أقصى أثرتنفيذ الأوامر عن بُعد بدون مصادقة
الإصدار المُصحَّح1.4.4+ (يستبدل unserialize بـ json_decode أو allowed_classes: false)

2. مفاهيم ذات صلة

تسلسل / إلغاء تسلسل PHP

تستخدم PHP الدالة serialize() لتحويل كائن إلى سلسلة نصية منظمة، والدالة unserialize() لاستعادة الكائن من تلك السلسلة. عندما تستقبل unserialize() بيانات من مصدر غير موثوق (مثل إدخال المستخدم)، يمكن للمهاجم إنشاء كائن تعسفي ينتمي إلى أي فئة محملة حاليًا في ذاكرة PHP في تلك اللحظة.

الدوال السحرية في PHP

دوال خاصة تستدعيها PHP تلقائيًا أثناء دورة حياة الكائن. الأكثر أهمية في هذا السياق:

  • __wakeup() — تُستدعى فورًا عند إلغاء تسلسل كائن
  • __destruct() — تُستدعى عند تدمير كائن (يخرج عن النطاق، أو تنتهي الطلبية)
  • __toString() — تُستدعى عند تحويل كائن إلى سلسلة

سلسلة POP (البرمجة الموجهة بالخصائص)

تقنية لربط عدة دوال سحرية من فئات موجودة داخل التطبيق لبناء سلسلة سلوكيات خطيرة. لا يكتب المهاجم كودًا جديدًا — بل يتلاعب فقط بخصائص الكائنات الموجودة بحيث تنفذ الدوال السحرية إجراءات لم يقصدها المطورون.

maybe_unserialize() في ووردبريس

دالة غلاف في نواة ووردبريس. تستدعي is_serialized() للتحقق مما إذا كانت السلسلة بيانات متسلسلة — إذا كان الأمر كذلك، تستدعي unserialize() لاستعادة الكائن. المشكلة: هذه الدالة لا تمرر معامل allowed_classes (المتوفر منذ PHP 7.0) لتقييد الفئات المسموح بإنشائها.


3. تحليل السبب الجذري — اكتشاف الثغرة من الكود المصدري

الخطوة 1: العثور على نقاط الغرق (Sink Hunting)

ابدأ بفحص الكود المصدري الكامل للملحق لتحديد دوال إلغاء التسلسل — فهذه أخطر الدوال في PHP لأنها قد تؤدي إلى حقن الكائنات:

grep -rn "unserialize" wp-src/wp-content/plugins/contact-form-entries/

image.png

يكشف الإخراج عن عدة مواضع استدعاء لـ maybe_unserialize()، أبرزها داخل includes/data.php السطر 545 ضمن الدالة verify_val():

image 1.png

// data.php lines 538-548
public function verify_val($string){
    if(in_array(substr(ltrim($string),0,1), array('{','['))
       && in_array(substr(rtrim($string),-1), array('}',']'))
    ){
        $val = json_decode($string, 1);
        if(is_array($val)){ $string = $val; }
    } else if(is_serialized($string)){            // line 544
        $string = maybe_unserialize($string);     // ★ line 545 — SINK
    }
    return $string;
}

السؤال الأساسي: من أين يأتي المتغير $string؟ إذا جاء من إدخال المستخدم دون تصفية → فهذه ثغرة.

الخطوة 2: التتبع العكسي — من أين تأتي البيانات؟

ابحث عن مكان استدعاء verify_val(). تتبع للخلف في نفس ملف data.php:

image 2.png

// data.php lines 520-535
public function get_lead_detail($lead_id){
    global $wpdb;
    $table = $wpdb->prefix . 'vxcf_leads_detail';
    $detail_arr = $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM $table WHERE lead_id=%d", $lead_id),
        ARRAY_A
    );

    foreach($detail_arr as $k => $v){
        if(!empty($v['value'])){
            $detail_arr[$k]['value'] = $this->verify_val($v['value']);  // ← calls verify_val
        }
    }
    return $detail_arr;
}

→ $string هو بالضبط $v['value'] — القيم المسترجعة من جدول قاعدة البيانات wp_vxcf_leads_detail. تُستدعى هذه الدالة عندما يعرض المدير تفاصيل إدخال نموذج.

السؤال التالي: من أين تأتي البيانات الموجودة في wp_vxcf_leads_detail؟ من يكتبها؟

الخطوة 3: العثور على نقاط كتابة البيانات (المصدر)

من الخطوة 2، نعلم أن البيانات تُسحب من قاعدة البيانات. السؤال التالي: من يكتب البيانات فيها؟ ابحث عن استعلامات INSERT داخل data.php:

grep -rn "insert" wp-src/wp-content/plugins/contact-form-entries/includes/data.php

image 3.png

افتح كود الدالة create_lead() (الأسطر 85-103) للتفاصيل:

image 4.png

في السطرين 98-99، تُدرج القيمة $v — وهي محتوى حقل نموذج (مثل your-message) — مباشرة في قاعدة البيانات عبر $wpdb->insert(). يربط الملحق نفسه بحدث wpcf7_before_send_mail الخاص بـ Contact Form 7، لذا كلما قدم مستخدم نموذجًا، تُخزَّن جميع الحقول خامًا.

فحص إضافي: يستخدم الملحق بالفعل sanitize_text_field() و sanitize_textarea_field() قبل الحفظ، لكن هاتين الدالتين تزيلان فقط وسوم HTML والأحرف الخاصة — والحمولة المتسلسلة مثل O:21:"VulnerableFileHandler":2:{...} لا تحتوي على أي وسوم HTML وبالتالي تمرّ كاملة دون تغيير.

الخطوة 4: الخلاصة — تأكيد الثغرة

عند هذه النقطة، يتضح التدفق الكامل:

Unauthenticated user submits CF7 form (your-message field contains serialized object)
    ↓ sanitize_text_field() — DOES NOT block serialized strings
Saved into wp_vxcf_leads_detail table (raw payload)
    ↓
Admin views entry → get_lead_detail() → verify_val()
    ↓ is_serialized() returns true
maybe_unserialize($string) — line 545 → PHP instantiates arbitrary object
    ↓
Object's __destruct() executes → performs attacker-controlled action

السبب الجذري: تُستدعى الدالة maybe_unserialize() عند data.php:545 على بيانات أصلها إدخال مستخدم غير مصادق، دون تمرير allowed_classes: false. يحتاج المهاجم فقط إلى إرسال كائن PHP متسلسل عبر حقل your-message في نموذج CF7 → عندما يعرض المدير الإدخال، ينشئ PHP الكائن ويطلق الدالة السحرية __destruct().

الخطوة 5: التحقق بالمصحح (Xdebug)

تنزيل الأداة