Trong hướng dẫn này, chúng ta sẽ thảo luận về các cuộc tấn công Cross-Site Request Forgery [CSRF] và cách ngăn chặn chúng bằng Spring Security
đọc thêm
Bảo vệ CSRF với Spring MVC và Thymeleaf
Hướng dẫn nhanh và thiết thực để ngăn chặn các cuộc tấn công CSRF với Spring Security, Spring MVC và Thymeleaf
Đọc thêm →
Cấu hình tự động bảo mật khởi động mùa xuân
Hướng dẫn nhanh và thiết thực về cấu hình Spring Security mặc định của Spring Boot
Đọc thêm →
Giới thiệu về bảo mật phương thức mùa xuân
Hướng dẫn bảo mật mức phương thức bằng Spring Security framework
Đọc thêm →
2. Hai cuộc tấn công CSRF đơn giản
Có nhiều hình thức tấn công CSRF. Hãy thảo luận về một số trong những cái phổ biến nhất
2. 1. NHẬN Ví dụ
Hãy xem xét yêu cầu GET sau đây được sử dụng bởi người dùng đã đăng nhập để chuyển tiền vào tài khoản ngân hàng cụ thể 1234
GET //bank.com/transfer?accountNo=1234&amount=100
Nếu kẻ tấn công muốn chuyển tiền từ tài khoản của nạn nhân sang tài khoản của chính hắn — 5678 — hắn cần khiến nạn nhân kích hoạt yêu cầu
GET //bank.com/transfer?accountNo=5678&amount=1000
Có nhiều cách để thực hiện điều đó
- Liên kết – Kẻ tấn công có thể thuyết phục nạn nhân nhấp vào liên kết này, ví dụ, để thực hiện chuyển giao
Show Kittens Pictures
- Image – The attacker may use an
2. 2. BÀI Ví dụ
Giả sử yêu cầu chính cần phải là yêu cầu POST
POST //bank.com/transfer accountNo=1234&amount=100
Trong trường hợp này, kẻ tấn công cần để nạn nhân chạy một yêu cầu tương tự
POST //bank.com/transfer accountNo=5678&amount=1000
Neither the Transfer Money to John Account Number Amount
Đây là trang của ứng dụng chính, chạy trên miền gốc
We should note that we've implemented a GET through a simple link and a POST through a simple .
Bây giờ hãy xem trang của kẻ tấn công trông như thế nào
0GET //bank.com/transfer?accountNo=5678&amount=1000
Trang này sẽ chạy trên một miền khác — miền của kẻ tấn công
Cuối cùng, hãy chạy cục bộ cả ứng dụng gốc và ứng dụng kẻ tấn công
Để cuộc tấn công hoạt động, người dùng cần được xác thực với ứng dụng gốc bằng cookie phiên
Trước tiên hãy truy cập trang ứng dụng gốc
1GET //bank.com/transfer?accountNo=5678&amount=1000
Nó sẽ đặt cookie JSESSIONID trên trình duyệt của chúng tôi
Sau đó, hãy truy cập trang kẻ tấn công
2GET //bank.com/transfer?accountNo=5678&amount=1000
Nếu chúng tôi theo dõi các yêu cầu bắt nguồn từ trang của kẻ tấn công này, chúng tôi sẽ có thể phát hiện ra những yêu cầu đã tấn công ứng dụng gốc. Vì cookie JSESSIONID được gửi tự động cùng với các yêu cầu này, nên Spring sẽ xác thực chúng như thể chúng đến từ miền gốc
3. Ứng dụng MVC mùa xuân
Để bảo vệ các ứng dụng MVC, Spring thêm mã thông báo CSRF vào mỗi chế độ xem được tạo. Mã thông báo này phải được gửi tới máy chủ theo mọi yêu cầu HTTP sửa đổi trạng thái [PATCH, POST, PUT và DELETE — không NHẬN]. Điều này bảo vệ ứng dụng của chúng tôi khỏi các cuộc tấn công CSRF vì kẻ tấn công không thể lấy mã thông báo này từ trang của chính họ
Tiếp theo, chúng ta sẽ xem cách định cấu hình bảo mật ứng dụng của mình và cách làm cho ứng dụng khách của chúng ta tuân thủ nó
3. 1. Cấu hình bảo mật mùa xuân
Trong cấu hình XML cũ hơn [pre-Spring Security 4], bảo vệ CSRF bị tắt theo mặc định và chúng tôi có thể bật nó khi cần
3GET //bank.com/transfer?accountNo=5678&amount=1000
Bắt đầu từ Spring Security 4. x, tính năng bảo vệ CSRF được bật theo mặc định
Cấu hình mặc định này thêm mã thông báo CSRF vào thuộc tính HttpServletRequest có tên _csrf
Nếu cần, chúng ta có thể tắt cấu hình này
4GET //bank.com/transfer?accountNo=5678&amount=1000
3. 2. Cấu hình máy khách
Bây giờ chúng tôi cần đưa mã thông báo CSRF vào các yêu cầu của mình
Thuộc tính _csrf chứa thông tin sau
- mã thông báo – giá trị mã thông báo CSRF
- tham sốName – tên của tham số biểu mẫu HTML, phải bao gồm giá trị mã thông báo
- headerName – tên của tiêu đề HTTP, phải bao gồm giá trị mã thông báo
Nếu chế độ xem của chúng tôi sử dụng biểu mẫu HTML, chúng tôi sẽ sử dụng giá trị tham sốName và mã thông báo để thêm đầu vào ẩn
5GET //bank.com/transfer?accountNo=5678&amount=1000
Nếu chế độ xem của chúng tôi sử dụng JSON, chúng tôi cần sử dụng các giá trị tiêu đề và mã thông báo để thêm tiêu đề HTTP
Trước tiên, chúng tôi cần bao gồm giá trị mã thông báo và tên tiêu đề trong thẻ meta
6GET //bank.com/transfer?accountNo=5678&amount=1000
Sau đó, hãy truy xuất các giá trị thẻ meta bằng JQuery
7GET //bank.com/transfer?accountNo=5678&amount=1000
Cuối cùng, hãy sử dụng các giá trị này để đặt tiêu đề XHR của chúng tôi
8GET //bank.com/transfer?accountNo=5678&amount=1000
4. API mùa xuân không trạng thái
Hãy xem xét trường hợp API mùa xuân không trạng thái được sử dụng bởi giao diện người dùng
Như đã giải thích trong bài viết chuyên dụng của chúng tôi, chúng tôi cần hiểu liệu bảo vệ CSRF có cần thiết cho API không trạng thái của chúng tôi hay không
Nếu API không trạng thái của chúng tôi sử dụng xác thực dựa trên mã thông báo, chẳng hạn như JWT, chúng tôi không cần bảo vệ CSRF và chúng tôi phải tắt nó như chúng tôi đã thấy trước đó
Tuy nhiên, nếu API không trạng thái của chúng tôi sử dụng xác thực cookie phiên, chúng tôi cần bật bảo vệ CSRF như chúng tôi sẽ thấy tiếp theo
4. 1. Cấu hình phụ trợ
API phi trạng thái của chúng tôi không thể thêm mã thông báo CSRF như cấu hình MVC của chúng tôi vì nó không tạo bất kỳ chế độ xem HTML nào
Trong trường hợp đó, chúng tôi có thể gửi mã thông báo CSRF trong cookie bằng CookieCsrfTokenRepository
9GET //bank.com/transfer?accountNo=5678&amount=1000
Cấu hình này sẽ đặt cookie XSRF-TOKEN cho giao diện người dùng. Vì chúng tôi đặt cờ chỉ HTTP thành sai nên giao diện người dùng sẽ có thể truy xuất cookie này bằng JavaScript
4. 2. Cấu hình giao diện người dùng
Với JavaScript, chúng ta cần tìm kiếm giá trị cookie XSRF-TOKEN từ tài liệu. danh sách cookie
Vì danh sách này được lưu trữ dưới dạng một chuỗi, chúng tôi có thể truy xuất nó bằng cách sử dụng biểu thức chính quy này
0Show Kittens Pictures
Sau đó, chúng tôi phải gửi mã thông báo tới mọi yêu cầu REST để sửa đổi trạng thái API. ĐĂNG, ĐẶT, XÓA và VÁ
Spring mong nhận được nó trong tiêu đề X-XSRF-TOKEN
Chúng ta có thể chỉ cần đặt nó bằng API tìm nạp JavaScript
1Show Kittens Pictures
5. CSRF bị vô hiệu hóa kiểm tra
Với tất cả những điều đó, hãy làm một số thử nghiệm
Trước tiên, hãy thử gửi một yêu cầu POST đơn giản khi CSRF bị tắt
2Show Kittens Pictures
Ở đây, chúng tôi đang sử dụng một lớp cơ sở để giữ logic của trình trợ giúp thử nghiệm chung - CsrfAbstractIntegrationTest
3Show Kittens Pictures
Chúng ta nên lưu ý rằng yêu cầu đã được thực hiện thành công khi người dùng có thông tin đăng nhập bảo mật phù hợp — không cần thêm thông tin
Điều đó có nghĩa là kẻ tấn công có thể chỉ cần sử dụng bất kỳ vectơ tấn công nào đã thảo luận trước đó để xâm phạm hệ thống
6. Kiểm tra kích hoạt CSRF
Bây giờ, hãy kích hoạt tính năng bảo vệ CSRF và xem sự khác biệt
4Show Kittens Pictures
Chúng ta có thể thấy thử nghiệm này đang sử dụng một cấu hình bảo mật khác như thế nào — một cấu hình đã bật tính năng bảo vệ CSRF
Bây giờ, yêu cầu POST sẽ không thành công nếu mã thông báo CSRF không được bao gồm, điều này tất nhiên có nghĩa là các cuộc tấn công trước đó không còn là một tùy chọn
Hơn nữa, phương thức csrf[] trong thử nghiệm tạo RequestPostProcessor tự động điền mã thông báo CSRF hợp lệ trong yêu cầu cho mục đích thử nghiệm
7. Phần kết luận
Trong bài viết này, chúng tôi đã thảo luận về một số cuộc tấn công CSRF và cách ngăn chặn chúng bằng Spring Security
Chúng tôi có thể gửi mã thông báo CSRF trong URL không?
Việc đặt mã thông báo phiên và/hoặc CSRF trong URL làm tăng khả năng bị tấn công . Cách an toàn để sử dụng xác thực CSRF là chỉ sử dụng nó cho các yêu cầu POST [hoặc yêu cầu tương đương như PUT/DEL/UPDATE, v.v. ]Chúng tôi có thể tắt bảo vệ CSRF không?
Bạn có thể tắt tính năng bảo vệ CSRF bằng cách đặt csrf. bảo vệ. đã bật mục cấu hình hệ thống thành giá trị false . Điều này có thể được thực hiện thông qua API REST.Làm cách nào để ẩn mã thông báo CSRF trong Django?
Do đó, bạn chỉ cần xóa {% csrf_token%} khỏi biểu mẫu trong mẫu của mình . Lưu câu trả lời này. Hiển thị hoạt động trên bài đăng này. Xóa {% csrf_token %} khỏi biểu mẫu của bạn trong mẫu, bạn không cần nó vì bạn đang thực hiện yêu cầu GET.@csrf Giả mạo yêu cầu trang web chéo CSRF ]] trong laravel là gì?
Giả mạo yêu cầu trên nhiều trang web là một loại khai thác độc hại theo đó các lệnh trái phép được thực hiện thay mặt cho người dùng đã được xác thực . Laravel tự động tạo "mã thông báo" CSRF cho mỗi phiên người dùng đang hoạt động do ứng dụng quản lý.