
Ce dépôt contient une boîte à outils pratique de recherche et de validation pour CVE-2025-4396, une injection SQL aveugle basée sur le temps, non authentifiée, affectant le plugin WordPress Relevanssi via le paramètre `cats`.
Ce dépôt contient un toolkit pratique de recherche et de validation pour CVE-2025-4396, une injection SQL aveugle basée sur le temps non authentifiée affectant le plugin WordPress Relevanssi via le paramètre cats.
Le projet a été conçu pour des engagements Purple Team autorisés afin de :
Le dépôt comprend :
Avertissement
Ce projet est fourni uniquement à des fins éducatives, de validation défensive et de tests de sécurité autorisés.
Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite d'évaluation.
CVE-2025-4396 est une vulnérabilité d'injection SQL affectant la fonctionnalité de recherche Relevanssi dans WordPress.
Dans le scénario testé, le problème est accessible via le flux de recherche et plus précisément via le paramètre cats. Le chemin de code vulnérable permet à une entrée contrôlée par l'attaquant d'influencer la requête SQL générée par le plugin.
Étant donné que le point d'accès vulnérable est accessible sans authentification préalable, la faille peut être exploitée par un attaquant distant pour réaliser une injection SQL non authentifiée.
L'impact pratique comprend :
La vulnérabilité existe parce que l'entrée contrôlée par l'utilisateur provenant d'un paramètre lié à la recherche n'est pas traitée de manière sécurisée avant d'être incorporée dans une requête SQL.
En pratique, cela signifie qu'un attaquant peut injecter des expressions SQL dans la logique de requête du backend et forcer la base de données à évaluer des conditions supplémentaires.
La vulnérabilité est exploitée en mode aveugle, ce qui signifie que l'application n'affiche pas directement les erreurs SQL ni les résultats bruts de la base de données.
Au lieu de lire la sortie de la requête sur la page, l'attaquant pose à la base de données une série de questions vrai/faux et observe un effet secondaire :
L'exploitation repose sur des fonctions SQL telles que SLEEP() pour créer une différence mesurable dans le temps de réponse du serveur.
Cela permet à un attaquant de déduire des données sans jamais les voir directement.
Par exemple, l'attaquant peut poser des questions telles que :
$ ? »En répétant ce processus, l'attaquant peut reconstruire un hash complet caractère par caractère.
L'approche standard parcourt un jeu de caractères connu et teste chaque candidat un par un.
Pour chaque position dans le hash cible :
Cette méthode est simple et fiable, mais relativement lente car elle peut nécessiter de nombreuses requêtes par caractère.
L'approche plus rapide utilise la recherche binaire sur la valeur ASCII de chaque caractère.
Au lieu de demander :
a ? »b ? »c ? »elle demande :
Cela divise l'espace de recherche par deux à chaque requête et réduit considérablement le nombre de requêtes HTTP.
L'attaque permet à l'opérateur d'extraire la valeur user_pass de wp_users, généralement pour un ID utilisateur WordPress choisi tel que :
1 pour l'administrateur par défaut,Dans les versions récentes de WordPress, cette valeur peut utiliser le nouveau pipeline de mots de passe WordPress 6.8+, qui combine :
CVE_2025_4396.pyIl s'agit du script d'extraction standard.
Il effectue une injection SQL aveugle basée sur le temps classique et extrait le hash cible caractère par caractère à l'aide d'une recherche linéaire sur un jeu de caractères fixe.
Pour chaque position de caractère :
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.pyIl s'agit de l'édition à recherche binaire.
Il poursuit le même objectif d'extraction que le script standard, mais remplace la recherche linéaire caractère par caractère par une recherche binaire sur les valeurs ASCII.
Pour chaque position :
python3requestsurllib3pip3 install requests urllib3
python3 CVE_2025_4396_Stealth.py -t "https://target.local/?s=test&cats=" -u 1 -s 3 -v
Une fois le hash de mot de passe extrait de WordPress, l'étape suivante consiste à le casser hors ligne.
Notes sur le hachage WordPress 6.8+. Dans le flux de travail testé, la valeur extraite peut ressembler à :
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Pour Hashcat, la partie bcrypt utilisable est :
$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.
Cependant, ce bcrypt n'est pas appliqué directement au mot de passe brut. WordPress applique d'abord une étape de prétraitement :
Cela signifie qu'une liste de mots normale ne peut pas être envoyée directement à Hashcat si vous voulez reproduire la logique exacte de WordPress 6.8+.
Au lieu de cela, chaque mot de passe candidat doit d'abord être transformé en sa représentation pré-hachée compatible WordPress.
Le dépôt comprend également un script « helper » qui :
$wp$ si nécessaire,Extraire le hash :
$wp$2y$10$zPA8xGJMvr.kvAAIIYaCreIMnTDpgw/9o8K7.ONBm/KBbNIywQtu.Préparer l'environnement de cassage :
python3hashcat disponible dans le PATHExécuter 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
Le contenu de détection suivant peut être utilisé par les équipes SOC pour identifier les tentatives d'exploitation et mesurer la maturité défensive.
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]
Les détections de base ci-dessus sont efficaces pour une exploitation non obfusquée, mais elles deviennent moins efficaces lorsqu'un opérateur introduit des techniques plus avancées.
La visibilité du SOC se dégrade lorsque l'attaquant commence à utiliser :
.
├── CVE_2025_4396.py
├── CVE_2025_4396_Stealth.py
├── Auto_Crack.py
├── README.md
└── relevanssi.4.24.4.zip
À utiliser uniquement dans des environnements où vous êtes explicitement autorisé à effectuer des tests. Les auteurs et contributeurs déclinent toute responsabilité en cas d'utilisation abusive.
Avertissement
Ce projet est fourni uniquement à des fins éducatives, de validation défensive et de tests de sécurité autorisés.
Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite d'évaluation.