Cross-site request forgery (CSRF)
Last updated
Last updated
CSRF là lỗ hổng bảo mật web cho phép kẻ tân công dụ dỗ người dùng thực hiện các hành động mà họ không chủ ý thực hiện. Nó cho phép kẻ tấn công phá vỡ phần nào chính sách same origin policy, được thiết kế để ngăn chặn các trang web khách nhau can thiệp lẫn nhau
Trong một cuộc tấn công CSRF thành công, kẻ tấn công khiến người dùng nạn nhân thực hiện một hành động vô ý (có thể là thay đổi email, mật khẩu hoặc thực hiện chuyển tiền). Một số hành động ấy còn giúp cho kẻ tấn công có thể giành quyền kiểm soát hoàn toàn đối với tài khoản người dùng. Nếu người dùng bị xâm phạm có đặc quyền trong ứng dụng, thì kẻ tấn công có thể giành được quyền kiểm soát hoàng toàn đối với tất cả dữ liệu và chức năng của ứng dụng
3 điều kiện chính phải có của một cuộc tấn công CSRF:
Một hành động có liên quan (Thay đổi đặc quyền người dùng/ Thay đổi mật khẩu email của người dùng ...)
Xử lý phiên dựa trên cookie (Ứng dụng chỉ dựa vào cookie phiến để xác định người dùng nào đã thực hiện các yêu cầu, không có cơ chế khác để theo dõi phiên và xác thực yêu cầu của người dùng)
Không có tham số yêu cầu không thể đoán được (Ví dụ như chức năng đổi mật khẩu không yêu cầu nhập mật khẩu hiện tại)
Ví dụ: Chưc năng thay đổi địa chỉ email có HTTP như sau:
Điều này đáp ứng các điều kiện cần thiết cho CSRF:
Thay đổi địa chỉ email là mối quan tâm của kẻ tấn công -> sau này có thể kích hoạt đặt lại mật khẩu và chiếm tài khoản
Ứng dụng chỉ sử dụng cookie phiên để xác định người dùng nao đã đưa ra yêu cầu. Không có token hoặc cơ chế nào khác để theo dõi phiên người dùng
Kẻ tấn công có thể dẽ dàng xác định giá trị của các tham số yêu cầu cần thiết để thực hiện hành động
Với những điều kiện này, kẻ tấn công có thể xây dựng một trang web có chứa mã HTML sau:
Nếu người dùng nạn nhân truy cập vào trang web của kẻ tấn công:
Trang này sẽ kích hoạt HTTP request tới trang web dễ bị tấn công
Nếu người dùng đăng nhập vào trang web dẽ bị tấn công, trình duyệt sẽ tự động đưa cookie phiên của họ vào request (Giả sử cookie SameSite không được sử dụng)
Trang web dẽ bị tấn công sẽ thực thi request theo cách thông thường, coi yêu cầu đó như được thực hiện bởi người dùng nạn nhân và thay đổi địa chỉ email của họ.
Chọn Yêu Cầu: Trong Burp Suite, chọn yêu cầu HTTP bạn muốn kiểm tra.
Tạo PoC CSRF: Nhấp chuột phải vào yêu cầu và chọn Engagement tools / Generate CSRF PoC.
Xem và Tinh Chỉnh HTML: Burp Suite tạo HTML để kích hoạt yêu cầu. Tinh chỉnh nếu cần.
Kiểm Tra PoC: Sao chép HTML vào một trang web, mở trang trong trình duyệt đã đăng nhập, và kiểm tra kết quả.
Giải pháp:
Đăng nhập và sử dụng chức năng đổi email, quan sát thấy POST request dễ bị tấn công CSRF:
Tạo Payload như sau
Trên exploit server Store và Deliver to victim
Cơ chế phân phối về cơ bản giống như đối với reflected XSS. Thông thường, kẻ tấn công sẽ đặt HTML độc hại vào một website mà chúng điều khiển, và sau đó xúi giục nạn nhân truy cập trang web đó. Điều này có thể thực hiện bằng cách cung cấp cho người dùng một link tới website hoặc tin nhắn trên mạng xã hội. Hoặc nếu cuộc tấn công được đặt vào một trang web phổ biến (ví dụ: trong comment người dùng), chúng có thể chỉ đợi người dùng truy cập vào trang web đó.
Một số cuộc tấn công CSRF đơn giản sử dụng phương thức GET có thể được thực hiện hoàn toàn chỉ với một URL trên trang web dễ bị tấn công. Trong trường hợp này, kẻ tấn công không cần sử dụng trang web bên ngoài mà chỉ cần gửi cho nạn nhân một URL độc hại trực tiếp trên tên miền dễ bị tấn công. Ví dụ, nếu việc thay đổi địa chỉ email có thể thực hiện bằng phương thức GET, cuộc tấn công tự chứa có thể trông như sau:
Nạn nhân truy cập URL này sẽ thực hiện hành động thay đổi email mà không cần biết.
Cross-Site Scripting (XSS): Cho phép kẻ tấn công thực thi mã JavaScript bất kỳ trong trình duyệt của người dùng bị tấn công.
Cross-Site Request Forgery (CSRF): Cho phép kẻ tấn công dẫn dụ người dùng thực hiện các hành động mà họ không có ý định làm.
Hậu quả:
XSS nghiêm trọng hơn CSRF.
CSRF thường chỉ giới hạn ở một số hành động mà người dùng có thể thực hiện, trong khi XSS có thể khiến người dùng thực hiện bất kỳ hành động nào họ có quyền thực hiện.
CSRF là lỗ hổng "một chiều" - kẻ tấn công chỉ có thể gửi yêu cầu nhưng không nhận được phản hồi.
XSS là "hai chiều" - mã độc có thể gửi yêu cầu và đọc phản hồi, sau đó gửi dữ liệu ra ngoài.
CSRF tokens có thể ngăn chặn một số tấn công XSS (đặc biệt là reflected XSS).
Ví dụ: nếu trang yêu cầu một CSRF token hợp lệ để xử lý yêu cầu, việc khai thác lỗ hổng XSS có thể bị chặn.
Lưu ý:
Nếu lỗ hổng XSS tồn tại ở bất kỳ nơi nào không có bảo vệ bằng CSRF token, thì lỗ hổng đó vẫn có thể bị khai thác.
CSRF tokens không bảo vệ trước XSS lưu trữ (stored XSS), vì mã độc sẽ được thực thi khi người dùng truy cập trang chứa nội dung đã bị chèn mã.
Hiện nay, việc tìm và khai thác lỗ hổng CSRF thường đòi hỏi phải vượt qua các biện pháp bảo vệ mà trang web hoặc trình duyệt của nạn nhân áp dụng. Các biện pháp phòng thủ phổ biến bao gồm:
CSRF tokens:
Là một giá trị bí mật, duy nhất, và không thể đoán trước, được tạo bởi ứng dụng phía server và chia sẻ với client. Khi thực hiện các hành động nhạy cảm như gửi form, client phải gửi kèm CSRF token hợp lệ. Điều này khiến việc tạo ra một yêu cầu hợp lệ thay mặt nạn nhân trở nên rất khó khăn.
SameSite cookies:
SameSite là một cơ chế bảo mật trình duyệt kiểm soát khi nào cookie của trang web được bao gồm trong các yêu cầu từ trang khác. Vì các hành động nhạy cảm thường yêu cầu cookie phiên xác thực, việc giới hạn SameSite có thể ngăn kẻ tấn công kích hoạt hành động từ các trang khác. Từ năm 2021, Chrome thực thi hạn chế SameSite Lax mặc định, và các trình duyệt lớn khác có thể sẽ làm tương tự trong tương lai.
Xác thực dựa trên Referer:
Một số ứng dụng sử dụng HTTP Referer header để bảo vệ chống lại các cuộc tấn công CSRF, thường bằng cách kiểm tra xem yêu cầu có bắt nguồn từ chính miền của ứng dụng hay không. Tuy nhiên, phương pháp này kém hiệu quả hơn so với xác thực CSRF token.
CSRF token là cách phòng thủ mạnh mẽ nhất để ngăn chặn. Để bảo vệ hiệu quả, CSRF token cần phải:
Không thể dự đoán với độ entropy cao
Liên kết với phiên của người dùng
Được xác thực nghiêm ngặt trước khi thực hiện hành động liên quan.
Nên sử dụng trình tạo số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) và kết hợp với timestamp khi token được tạo ra cùng một bí mật tĩnh.
Để tăng cường bảo mật, có thể thêm entropy cụ thể của người dùng và sử dụng hàm băm mạnh để tạo token
Token nên được truyền qua một trường ẩn (hidden field) trong form HTML dùng phương thức POST. Ví dụ:
Token không nên được truyền qua chuỗi truy vấn URL vì nó có thể bị ghi lại hoặc chia sẻ không an toàn.
Một số ứng dụng có thể truyền CSRF tokens qua custom headers, giúp bảo vệ thêm khỏi kẻ tấn công.
Token phải được lưu trữ phía server trong dữ liệu phiên của người dùng và được xác thực khi yêu cầu tiếp theo cần được thực hiện
Nếu yêu cầu không chứa token hoặc token không hợp lệ, yêu cầu đó phải bị từ chối
Ngoài việc triển khai xác thực token CSRF mạnh mẽ, cần thiết lập rõ ràng các hạn chế SameSite với mỗi cookie được phát hành. Điều này cho phép kiểm soát ngữ cảnh mà cookie được sử dụng, bất kể trình duyệt nào.
Mặc dù các trình duyệt có thể mặc định sử dụng chính sách "Lax-by-default", nhưng chính sách này không phù hợp cho mọi loại cookie và có thể dễ dàng bị vượt qua hơn so với Strict.
Strict nên được sử dụng mặc định và chỉ nên giảm xuống Lax nếu có lý do cụ thể. Không nên vô hiệu hóa SameSite với SameSite=None trừ khi hiểu rõ các tác động bảo mật.
SameSite bảo vệ tốt khỏi các tấn công giữa các trang web khác nhau nhưng không bảo vệ được các cuộc tấn công cùng site nhưng khác nguồn. Vì vậy, nên cách ly nội dung không an toàn (ví dụ như file tải lên của người dùng) trên một trang riêng biệt để bảo vệ dữ liệu nhạy cảm.
Sử dụng của