
Questo repository contiene un toolkit pratico di ricerca e validazione per CVE-2025-4396, una SQL injection cieca basata sul tempo non autenticata che colpisce il plugin WordPress Relevanssi tramite il parametro `cats`.
Questa repository contiene un toolkit pratico di ricerca e validazione per CVE-2025-4396, una SQL Injection Blind basata sul tempo non autenticata che colpisce il plugin WordPress Relevanssi tramite il parametro cats.
Il progetto è stato realizzato per esercitazioni Purple Team autorizzate al fine di:
La repository include:
Disclaimer
Questo progetto è fornito esclusivamente a scopo didattico, di validazione difensiva e di test di sicurezza autorizzati.
Non utilizzarlo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione scritta a valutare.
CVE-2025-4396 è una vulnerabilità di SQL Injection che colpisce la funzionalità di ricerca Relevanssi in WordPress.
Nello scenario testato, il problema è raggiungibile tramite il flusso di ricerca e più specificamente attraverso il parametro cats. Il percorso di codice vulnerabile consente a input controllati dall'attaccante di influenzare la query SQL generata dal plugin.
Poiché l'endpoint vulnerabile è accessibile senza autenticazione preventiva, la falla può essere sfruttata da un attaccante remoto per eseguire una SQL injection non autenticata.
L'impatto pratico include:
La vulnerabilità esiste perché l'input controllato dall'utente proveniente da un parametro correlato alla ricerca non viene gestito in modo sicuro prima di essere incorporato in una query SQL.
In pratica, ciò significa che un attaccante può iniettare espressioni SQL nella logica delle query del backend e costringere il database a valutare condizioni aggiuntive.
La vulnerabilità viene sfruttata in modalità blind (cieca), il che significa che l'applicazione non mostra direttamente errori SQL o risultati grezzi del database.
Invece di leggere l'output della query dalla pagina, l'attaccante pone al database una serie di domande vero/falso e osserva un effetto collaterale:
Lo sfruttamento si basa su funzioni SQL come SLEEP() per creare una differenza misurabile nel tempo di risposta del server.
Ciò consente a un attaccante di dedurre i dati senza mai vederli direttamente.
Ad esempio, l'attaccante può porre domande come:
$?"Ripetendo questo processo, l'attaccante può ricostruire un intero hash carattere per carattere.
L'approccio standard scorre un set di caratteri noto e testa ogni candidato uno per uno.
Per ogni posizione nell'hash target:
Questo metodo è semplice e affidabile, ma relativamente lento perché può richiedere molte richieste per carattere.
L'approccio più veloce usa la ricerca binaria sul valore ASCII di ogni carattere.
Invece di chiedere:
a?"b?"c?"chiede:
Questo divide lo spazio di ricerca a metà a ogni richiesta e riduce drasticamente il numero di richieste HTTP.
L'attacco consente all'operatore di estrarre il valore user_pass da wp_users, tipicamente per un ID utente WordPress scelto come:
1 per l'amministratore predefinito,Nelle versioni recenti di WordPress, questo valore può utilizzare il nuovo pipeline di password WordPress 6.8+, che combina:
CVE_2025_4396.pyQuesto è lo script di estrazione standard.
Esegue una classica SQL Injection Blind basata sul tempo ed estrae l'hash target carattere per carattere usando una ricerca lineare su un charset fisso.
Per ogni posizione del carattere:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Arguments :
-t, --target : vulnerable target URL including the injectable parameter
-u, --userid : WordPress user ID to target
-s, --sleep : sleep threshold in seconds
-v, --verbose : enable debug logging
CVE_2025_4396_Stealth.pyQuesta è l'edizione con ricerca binaria.
Esegue lo stesso obiettivo di estrazione dello script standard, ma sostituisce la ricerca lineare carattere per carattere con una ricerca binaria sui valori ASCII.
Per ogni posizione:
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Una volta estratto l'hash della password da WordPress, il passo successivo è craccarlo offline.
Note sull'hashing di WordPress 6.8+. Nel flusso di lavoro testato, il valore estratto può apparire come:
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Per Hashcat, la porzione bcrypt utilizzabile è:
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Tuttavia, questo bcrypt non viene applicato direttamente alla password grezza. WordPress applica prima una fase di pre-elaborazione:
Ciò significa che una wordlist normale non può essere inviata direttamente a Hashcat se si vuole riprodurre l'esatta logica di WordPress 6.8+.
Invece, ogni password candidata deve essere prima trasformata nella sua rappresentazione pre-hash compatibile con WordPress.
La repository include anche uno script "helper" che:
$wp$ quando necessario,Estrarre l'hash :
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.Preparare l'ambiente di cracking :
python3hashcat disponibile nel PATHEseguire Auto_Crack.py :
python3 Auto_Crack.py -H '\$wp\$2y\$10\$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.' -w /usr/share/wordlists/rockyou.txt
We need to escape "$" with "\" -> bash compatibility
Il seguente contenuto di rilevamento può essere utilizzato dai team SOC per identificare tentativi di sfruttamento e misurare la maturità difensiva.
title: Potential Time-Based Blind SQLi (CVE-2025-4396 Relevanssi)
id: 5a8a1c93-5c74-4b5b-a620-8e1c3e41ab5d
status: experimental
description: Detects HTTP GET requests containing typical Time-Based Blind SQL injection payloads often used to exploit CVE-2025-4396 in the WordPress Relevanssi plugin (bypassing comma filters).
author: n3fhara
date: 2026-03-18
tags:
- attack.initial_access
- attack.t1190
- cve.2025-4396
logsource:
category: webserver
detection:
selection_endpoint:
cs-uri-query|contains:
- 's='
- 'cats='
- 'tags='
selection_payload:
cs-uri-query|contains:
- 'SLEEP('
- 'WAITFOR'
- 'SUBSTRING('
- 'ASCII('
- 'LENGTH('
selection_bypass_indicators:
cs-uri-query|contains:
- 'FROM'
- 'FOR 1'
- '*('
condition: selection_endpoint and selection_payload and selection_bypass_indicators
falsepositives:
- Highly unlikely. Legitimate search queries should not contain SQL functions.
level: high
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"ET EXPLOIT WordPress Relevanssi SQLi Attempt (CVE-2025-4396)"; flow:established,to_server; content:"GET"; http_method; content:"cats="; http_uri; pcre:"/(cats|tags)=.*(SLEEP|WAITFOR)%28.*(%2A|\*).*SUBSTRING/i"; classtype:web-application-attack; sid:1000001; rev:1; metadata:created_at 2026_03_18, cve CVE_2025_4396;)
index=web_logs sourcetype=access_combined
| regex uri_query="(?i)cats=|tags="
| stats count as request_count, avg(response_time) as avg_time, max(response_time) as max_time, dc(uri_query) as unique_payloads by clientip
| where request_count > 20 AND max_time > 2000
| sort - max_time
url.query : (*cats=* OR *tags=* OR *s=*) AND url.query : (*SLEEP* OR *WAITFOR* OR *SUBSTRING* OR *ASCII*) AND url.query : (*FROM* OR *FOR* OR *%2A*)
sequence by source.ip with maxspan=1m
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
[network where url.path == "/" and url.query : "*cats=*" and event.duration > 2000000000]
I rilevamenti di base sopra riportati sono buoni per sfruttamento non offuscato, ma diventano più deboli quando un operatore introduce tecniche più avanzate.
La visibilità del SOC si riduce quando l'attaccante inizia a usare:
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
Utilizzare solo in ambienti in cui si è esplicitamente autorizzati a testare. Gli autori e i contributori non si assumono alcuna responsabilità per un uso improprio.
Disclaimer
Questo progetto è fornito esclusivamente a scopo didattico, di validazione difensiva e di test di sicurezza autorizzati.
Non utilizzarlo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione scritta a valutare.