Cách xóa mã thông báo CSRF khỏi URL

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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    0

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    1

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    2

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    3

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    4

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    5

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    6

    Sau đó, hãy truy xuất các giá trị thẻ meta bằng JQuery

    GET //bank.com/transfer?accountNo=5678&amount=1000
    7

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    8

    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

    GET //bank.com/transfer?accountNo=5678&amount=1000
    9

    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

    
    Show Kittens Pictures
    
    0

    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

    
    Show Kittens Pictures
    
    1

    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

    
    Show Kittens Pictures
    
    2

    Ở đâ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

    
    Show Kittens Pictures
    
    3

    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

    
    Show Kittens Pictures
    
    4

    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ý.

Chủ Đề