Tấn công CSRF (Cross-Site Request Forgery)
CSRF (Cross-Site Request Forgery) là một kiểu tấn công bảo mật web mà trong đó kẻ tấn công lừa người dùng thực hiện các hành động không mong muốn trên một trang web mà họ đã xác thực trước đó. Tấn công CSRF lợi dụng việc trang web tin tưởng người dùng đã xác thực và thực hiện các yêu cầu thay mặt họ mà không kiểm tra nguồn gốc của yêu cầu.
Cách thức tấn công CSRF hoạt động:
-
Người dùng đăng nhập vào một trang web (Website A): Sau khi đăng nhập, trình duyệt của người dùng sẽ lưu trữ cookie phiên của họ để duy trì trạng thái đăng nhập.
-
Kẻ tấn công lừa người dùng truy cập vào một trang web độc hại (Website B): Trang web này chứa mã độc, chẳng hạn như một form ẩn hoặc một yêu cầu AJAX được tạo ra để gửi một yêu cầu đến Website A.
-
Yêu cầu được gửi từ Website B đến Website A: Trình duyệt của người dùng, vẫn còn lưu cookie phiên từ Website A, sẽ tự động đính kèm cookie này vào yêu cầu, khiến Website A nghĩ rằng yêu cầu này hợp lệ và từ người dùng đã xác thực.
-
Hành động không mong muốn được thực hiện: Website A thực hiện yêu cầu do kẻ tấn công tạo ra, dẫn đến các hành động không mong muốn như thay đổi mật khẩu, chuyển tiền, hoặc xóa tài khoản.
Cách phòng chống CSRF:
-
Sử dụng mã CSRF token: Khi người dùng gửi một form, trang web sẽ đính kèm một mã token duy nhất với form đó. Mã này sau đó sẽ được kiểm tra khi yêu cầu được gửi lại để đảm bảo rằng yêu cầu thực sự đến từ người dùng và không phải từ một trang web khác.
-
Kiểm tra nguồn gốc yêu cầu: Kiểm tra các header HTTP như
Referer
hoặcOrigin
để xác định xem yêu cầu có đến từ một trang hợp lệ không. -
Sử dụng các phương pháp xác thực bổ sung: Yêu cầu người dùng xác thực lại mật khẩu hoặc cung cấp mã OTP (One-Time Password) khi thực hiện các hành động quan trọng.
-
Cài đặt cookie với thuộc tính SameSite: Cài đặt cookie với thuộc tính
SameSite
để chỉ cho phép cookie được gửi cùng với các yêu cầu từ cùng một trang web, ngăn chặn việc cookie được gửi cùng với các yêu cầu từ trang web khác.
Các bước này giúp kiểm tra và đánh giá tính bảo mật của ứng dụng web trước các tấn công CSRF.
- Capture requests in Burp: Sử dụng Burp hoặc công cụ tương tự để chặn và phân tích các yêu cầu nhằm xác định có token CSRF hay không.
- Check token predictability: Đánh giá xem các token CSRF được sử dụng trong ứng dụng có dễ đoán hoặc dễ suy đoán hay không.
- Remove header-based tokens: Nếu token CSRF được bao gồm trong header, tạm thời loại bỏ nó khỏi yêu cầu và kiểm tra xem yêu cầu có còn hoạt động bình thường không.
- Manipulate token in the request body: Nếu token CSRF được bao gồm trong thân yêu cầu dưới dạng tham số, thử xóa giá trị của tham số đó. Nếu yêu cầu vẫn thành công, thử xóa cả tên tham số và giá trị để xem yêu cầu có bị tấn công hay không.
- Same CSRF token for different accounts: Kiểm tra xem ứng dụng có sử dụng cùng một token CSRF cho nhiều tài khoản người dùng khác nhau không.
- Replace CSRF token with a different value: Thay thế giá trị token CSRF bằng một giá trị khác có cùng độ dài để kiểm tra xem ứng dụng có xác thực đúng token hay không.
- Change request method: Thay đổi phương thức yêu cầu từ POST sang GET và loại bỏ token CSRF.
- Append _method parameter for PUT/PATCH requests: Đối với các ứng dụng sử dụng yêu cầu PUT hoặc PATCH, thử thêm tham số
_method
trong thân yêu cầu để giả lập một phương thức yêu cầu khác. - Check alternative content types: Xác minh xem các loại nội dung khác như
application/x-www-form-urlencoded
có được phép hay không. Nếu được phép, chỉnh sửa thủ công thân yêu cầu hoặc sử dụng công cụ. Ví dụ:{"name":"Test"}
nên được đổi thànhname=test
. - Bypass Referer Validation: Thử bỏ qua xác thực Referer bằng cách thêm mã sau vào tệp HTML PoC CSRF của bạn:
<meta name="referrer" content="never">
- Steal CSRF tokens using XSS or CORS: Kiểm tra xem ứng dụng có dễ bị tấn công bằng Cross-Site Scripting (XSS) hoặc Cross-Origin Resource Sharing (CORS) không, những lỗ hổng này có thể được sử dụng để đánh cắp token CSRF.
- Bypass JSON-based CSRF protection: Nếu ứng dụng thực hiện bảo vệ CSRF dựa trên JSON, thử vượt qua bằng cách sử dụng các phương pháp như gửi dữ liệu dưới dạng văn bản thuần hoặc khai thác các lỗ hổng CSRF của Flash.
Cảm xúc của bạn?