- Privilege Escalation là gì?
- Tại sao Privilege Escalation rất nguy hiểm trong WordPress?
- Privilege Escalation thường xảy ra ở đâu?
- 1. AJAX endpoint không kiểm tra capability
- 2. REST API thiếu permission_callback
- 3. Form settings không xác thực quyền
- 4. Nonce bị hiểu sai hoặc không sử dụng
- 5. Chức năng upload file không giới hạn role
- Ví dụ tấn công Privilege Escalation phổ biến
- 1. Tạo user admin mới qua AJAX
- 2. Đổi email admin qua REST API
- 3. Sửa option “default_role” thành “administrator”
- Cách phòng chống Privilege Escalation trong WordPress
- 1. Luôn kiểm tra quyền bằng current_user_can()
- 2. Trong AJAX, luôn kiểm tra cả capability + nonce
- 3. Trong REST API, luôn dùng permission_callback
- 4. Không bao giờ tin dữ liệu từ user, kể cả admin
- 5. Không tạo option hoặc meta tự do mà không kiểm soát
- 6. Không lạm dụng “unfiltered_html”
- 7. Kiểm tra kỹ capability list chuẩn của WordPress
- Checklist ngăn Privilege Escalation
- Kết luận
Privilege Escalation là gì?
Privilege Escalation xảy ra khi hacker sử dụng một tài khoản có quyền thấp (subscriber, customer, contributor…) để thực hiện hành động chỉ dành cho tài khoản có quyền cao (editor, admin, super admin).
Nói ngắn gọn: Hacker leo từ user thường lên admin mà không cần mật khẩu.
Tại sao Privilege Escalation rất nguy hiểm trong WordPress?
- Hacker có thể tạo user admin mới
- Cài plugin backdoor
- Chèn mã độc vào theme/plugin
- Lấy toàn bộ dữ liệu website
- Kiểm soát WooCommerce, đơn hàng, API key
- Đổi email quản trị → Reset mật khẩu → Chiếm site hoàn toàn
Privilege Escalation thường xảy ra ở đâu?
90% lỗi leo quyền trong WordPress đến từ plugin, theme, hoặc custom code.
1. AJAX endpoint không kiểm tra capability
Ví dụ sai:
add_action( 'wp_ajax_update_settings', function () {
update_option( 'my_plugin_options', $_POST['data'] );
});
→ Bất kỳ user nào đăng nhập cũng có thể gọi AJAX này.
2. REST API thiếu permission_callback
Ví dụ sai:
register_rest_route( 'my/v1', '/save', array(
'methods' => 'POST',
'callback' => 'my_save_data',
));
→ Endpoint mở toang, user cấp thấp vẫn truy cập được.
3. Form settings không xác thực quyền
// Sai: không kiểm tra quyền trước khi save
update_option( 'my_option', $_POST['data'] );
4. Nonce bị hiểu sai hoặc không sử dụng
Nhiều dev tưởng nonce là để “chống hack”, nhưng thực tế nonce không bảo vệ khỏi Privilege Escalation – chỉ chống CSRF. Nếu thiếu capability check thì nonce cũng vô dụng.
5. Chức năng upload file không giới hạn role
Không kiểm tra quyền → user thường upload file PHP → RCE → admin → tất cả.
Ví dụ tấn công Privilege Escalation phổ biến
1. Tạo user admin mới qua AJAX
Nếu plugin có AJAX tạo user mà không check quyền, hacker chỉ cần:
action=add_admin&username=hacker&role=administrator
2. Đổi email admin qua REST API
POST /wp-json/wp/v2/users/1 {"email":"[email protected]"}
3. Sửa option “default_role” thành “administrator”
Nếu plugin cho phép user sửa option mà không giới hạn:
update_option( 'default_role', 'administrator' );
→ Mọi người đăng ký mới = admin luôn.
Cách phòng chống Privilege Escalation trong WordPress
1. Luôn kiểm tra quyền bằng current_user_can()
Cách đúng:
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'No permission.' );
}
Cách sai:
if ( ! is_user_logged_in() ) { return; }
→ User thường vẫn là “logged in”.
2. Trong AJAX, luôn kiểm tra cả capability + nonce
function my_ajax_update() {
check_ajax_referer( 'my_nonce' );
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'No permission.' );
}
update_option( 'my_data', $_POST['data'] );
}
add_action( 'wp_ajax_my_update', 'my_ajax_update' );
3. Trong REST API, luôn dùng permission_callback
register_rest_route( 'my/v1', '/save', array(
'methods' => 'POST',
'callback' => 'my_save_data',
'permission_callback' => function () {
return current_user_can( 'manage_options' );
}
));
4. Không bao giờ tin dữ liệu từ user, kể cả admin
- Sanitize trước khi save
- Escape trước khi output
- Giới hạn quyền rõ ràng ở mọi function
5. Không tạo option hoặc meta tự do mà không kiểm soát
Nhiều dev dùng:
update_option( $_POST['key'], $_POST['value'] );
→ Hacker chỉ cần đặt key = default_role, users_can_register, hoặc admin_email.
6. Không lạm dụng “unfiltered_html”
User có quyền unfiltered_html có thể chèn script → XSS → Privilege Escalation chain.
7. Kiểm tra kỹ capability list chuẩn của WordPress
manage_options– quyền mạnh nhất cho adminedit_posts– cho author/contributoredit_users– quản lý userinstall_plugins– cực nguy hiểm
Checklist ngăn Privilege Escalation
- AJAX phải có capability check
- REST API phải có permission_callback
- Không cập nhật option nhạy cảm qua input user
- Không bao giờ dùng “is_user_logged_in()” để phân quyền
- Không cho phép user upload file tùy tiện
- Không tạo page admin mà không kiểm tra quyền
- Luôn kiểm tra role → capability → action
Kết luận
Privilege Escalation là một trong những lỗ hổng nguy hiểm nhất trong WordPress vì nó cho phép hacker chiếm toàn quyền mà không cần brute force hay SQL injection. Chỉ một lỗi nhỏ ở AJAX, REST API hoặc settings page cũng có thể khiến toàn bộ website bị chiếm quyền. Dev WordPress cần luôn tuân thủ quy trình kiểm tra capability, validate input và bảo vệ mọi action nhạy cảm.
Bình luận