CSRF trong WordPress – Khi hacker điều khiển hành động của bạn chỉ bằng một cú nhấp

CSRF (Cross-Site Request Forgery) là một trong những lỗ hổng phổ biến và nguy hiểm nhất trong WordPress. Hacker có thể khiến người dùng – đặc biệt là admin – thực hiện các hành động trái phép mà họ không hề hay biết. Chỉ cần admin đang đăng nhập và truy cập phải một website độc, kẻ tấn công có thể thay đổi cài đặt, thêm user admin mới, kích hoạt plugin độc hại, hoặc thậm chí xoá toàn bộ dữ liệu.

CSRF trong WordPress – Khi hacker điều khiển hành động của bạn chỉ bằng một cú nhấp

CSRF là gì?

CSRF xảy ra khi kẻ tấn công gửi một request đến website của bạn thay mặt nạn nhân, mà nạn nhân không hề biết. Vì trình duyệt tự gửi cookie của WordPress theo mỗi request, server nghĩ “đây là admin chính chủ”, trong khi thật ra là hacker đang điều khiển.

Nói ngắn gọn: Hacker ép bạn thực hiện hành động mà bạn không hề muốn.

CSRF khác gì với XSS?

  • XSS: Hacker chạy JavaScript trong trình duyệt nạn nhân.
  • CSRF: Hacker ép nạn nhân gửi request trái phép.

Nếu trang có XSS → hacker có thể làm CSRF. Nhưng CSRF không cần XSS để tồn tại.

Ví dụ CSRF đơn giản

Giả sử WordPress có endpoint:

https://example.com/wp-admin/[email protected]

Hacker chỉ cần chèn:

<img src="https://example.com/.../[email protected]" style="display:none;">

Chỉ cần admin nhìn thấy trang này, email quản trị đã bị đổi.

Tại sao CSRF nguy hiểm trong WordPress?

  • Admin luôn đăng nhập → session mở → dễ bị tấn công
  • Nhiều plugin cung cấp thao tác nhạy cảm qua AJAX hoặc GET request
  • WordPress dùng cookie → tự động gửi theo request
  • Không cần XSS, không cần lừa mật khẩu, không cần SQL injection

Chỉ cần một “đường dẫn” thiếu bảo vệ, hacker có thể chiếm quyền admin.

Những nơi dễ mắc CSRF nhất trong WordPress

  • AJAX handlers không dùng nonce
  • Form settings không có nonce
  • REST API không kiểm tra permission_callback
  • Link thao tác admin dùng GET thay vì POST
  • Plugin custom code update option mà không kiểm tra quyền

Ví dụ lỗi CSRF phổ biến

1. AJAX không có nonce

add_action( 'wp_ajax_save_settings', function () {
    update_option( 'my_settings', $_POST['data'] );
});

→ Hacker chỉ cần tạo form POST là admin bị ép cập nhật dữ liệu.

2. Form không có nonce

<form method="post">
    <input type="text" name="email">
    <button type="submit">Save</button>
</form>

→ CSRF 100% bị khai thác.

3. REST API không có permission_callback

register_rest_route( 'my/v1', '/update', array(
    'methods'  => 'POST',
    'callback' => 'my_update',
));

→ Bỏ trống permission_callback = mời hacker tấn công.

CSRF hoạt động như thế nào?

  1. Admin đăng nhập WordPress
  2. Admin ghé một website bẫy
  3. Website này gửi form/GET/POST đến WordPress của bạn
  4. WordPress tưởng đó là admin thật
  5. Hành động trái phép xảy ra

Mọi việc diễn ra trong vài mili-giây.

Cách chống CSRF trong WordPress

1. Luôn dùng Nonce trong form

WordPress cung cấp hệ thống nonce rất mạnh.

Trong form:

<form method="post">
    <?php wp_nonce_field( 'save_settings_action', 'save_settings_nonce' ); ?>
    <input name="data">
</form>

Trong processing:

if ( ! isset( $_POST['save_settings_nonce'] ) ||
     ! wp_verify_nonce( $_POST['save_settings_nonce'], 'save_settings_action' ) ) {
    wp_die( 'Invalid request.' );
}

2. AJAX phải dùng check_ajax_referer()

function my_ajax_save() {
    check_ajax_referer( 'my_nonce_action' );

    update_option( 'my_data', $_POST['data'] );
}
add_action( 'wp_ajax_my_save', 'my_ajax_save' );

3. REST API phải có permission_callback

register_rest_route( 'my/v1', '/update', array(
    'methods'  => 'POST',
    'callback' => 'my_update',
    'permission_callback' => function () {
        return current_user_can( 'manage_options' );
    }
));

Lưu ý: REST API không dùng nonce để xác thực quyền → chỉ dùng để chống CSRF cho AJAX (admin-ajax).

4. Không dùng GET cho hành động thay đổi dữ liệu

Ví dụ sai:

https://example.com/delete_post?id=12

→ Hacker chèn thẳng vào một thẻ <img> hoặc <a> là nạn nhân tự xóa post.

5. Kiểm tra quyền trước khi xử lý dữ liệu

if ( ! current_user_can( 'manage_options' ) ) {
    wp_die( 'No permission.' );
}

6. Không bao giờ xử lý request mà không có kiểm tra input

  • sanitize trước khi save
  • escape khi output
  • chặn action nếu thiếu nonce hoặc quyền

Chuỗi tấn công CSRF thường gặp

  • CSRF → đổi email admin → reset password → takeover site
  • CSRF → bật plugin giả mạo → cài shell
  • CSRF → update option nhạy cảm → site hỏng hoàn toàn
  • CSRF → tạo user admin → login thẳng

Checklist chống CSRF

  • Dùng nonce với tất cả form
  • Dùng check_ajax_referer() cho AJAX
  • REST API phải có permission_callback
  • Không dùng GET cho hành động nguy hiểm
  • Kiểm tra capability trước khi xử lý
  • Không bao giờ tin input từ người dùng

Kết luận

CSRF là một lỗ hổng cực kỳ nguy hiểm trong WordPress vì nó đánh vào điểm yếu cố hữu của trình duyệt: tự động gửi cookie. Chỉ cần thiếu nonce, thiếu permission check, hoặc dùng GET để thực hiện hành động thay đổi dữ liệu, website có thể bị chiếm quyền chỉ bằng một cú click. Developer WordPress cần hiểu rõ cách nonce hoạt động và áp dụng đúng cách để ngăn chặn CSRF ở mọi tính năng.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...