Là kích hoạt gấp đôi thoát nguy hiểm?


136

Tôi có một ứng dụng ASP.NET MVC với một tuyến đường cho phép tìm kiếm nội dung thông qua / search / <searchterm>.

Khi tôi cung cấp "search / abc" thì nó hoạt động tốt, nhưng khi tôi cung cấp "/ search / a + b + c" (mã hóa url chính xác) thì IIS7 từ chối yêu cầu với HTTP Error 404.11 ( Mô-đun lọc yêu cầu được cấu hình để từ chối a yêu cầu có chứa một chuỗi thoát kép ). Tất cả, tại sao nó làm điều này? Nó dường như chỉ ném lỗi nếu nó là một phần của URL, nhưng không phải là một phần của chuỗi truy vấn (/ truyền? Q = a + b + c hoạt động tốt).

Bây giờ tôi có thể kích hoạt các yêu cầu thoát kép trong phần bảo mật của web.config nhưng tôi ngần ngại thực hiện vì tôi không hiểu hàm ý này và tại sao máy chủ sẽ từ chối yêu cầu "a + b + c" như một phần của URL nhưng chấp nhận như một phần của chuỗi truy vấn.

Ai đó có thể giải thích và đưa ra một số lời khuyên phải làm gì?


7
Tôi cũng đã thử tùy chọn có thể đúng hơn khi gọi Mã hóa đường dẫn Server.Url và kết thúc bằng /search/a%2520b%2520cviệc đánh dấu dẫn đến lỗi "Giá trị Request.Path nguy hiểm tiềm tàng được phát hiện từ máy khách (%)". Bạn không thể chiến thắng dường như.
Zhaph - Ben Duguid

Câu trả lời:


158

Chỉnh sửa: Đã nhấn mạnh vào các phần có liên quan.

Về cơ bản: IIS đang bị hoang tưởng quá mức. Bạn có thể vô hiệu hóa kiểm tra này một cách an toàn nếu bạn không làm gì đặc biệt không khôn ngoan với dữ liệu được giải mã bằng uri (chẳng hạn như tạo URI của hệ thống tệp cục bộ thông qua nối chuỗi).

Để vô hiệu hóa kiểm tra, hãy làm như sau (từ đây ): (xem nhận xét của tôi bên dưới để biết những gì thoát gấp đôi đòi hỏi).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Nếu biểu tượng dấu cộng là ký tự hợp lệ trong đầu vào tìm kiếm, bạn sẽ cần bật "allowDoubleEscaping" để cho phép IIS xử lý đầu vào đó từ đường dẫn của URI.

Cuối cùng, một cách rất đơn giản, nếu cách giải quyết hạn chế chỉ đơn giản là để tránh '+' và sử dụng '% 20' thay vào đó. Trong mọi trường hợp, sử dụng biểu tượng '+' để mã hóa một khoảng trắng không phải là mã hóa url hợp lệ , nhưng cụ thể cho một bộ giao thức giới hạn và có thể được hỗ trợ rộng rãi vì lý do tương thích ngược. Nếu chỉ cho mục đích chuẩn hóa, tốt hơn hết là bạn nên mã hóa không gian dưới dạng '% 20'; và điều này đặc biệt vượt qua vấn đề IIS7 (vẫn có thể cắt xén cho các chuỗi khác, chẳng hạn như% 25ab.)


3
Tôi sẽ vô hiệu hóa kiểm tra. Đó là một rắc rối và không cung cấp bảo mật thêm cho hầu hết các ứng dụng.
Eamon Nerbonne

3
Bạn có một liên kết / tài liệu tham khảo rằng nó khá an toàn để vô hiệu hóa thoát kép không? Ngoài ra, chính xác những gì biện pháp bảo mật này ngăn chặn xảy ra?
Alex

15
Nếu một uri được thoát kép, thì các thành phần uri không được giải thoát có thể chứa các ký tự dành riêng và do đó (một phần của) uri không được giải thoát có thể là một uri hợp lệ. Nói tóm lại, nếu bạn sử dụng chuỗi uri chưa thoát để xây dựng các uri mới - cụ thể là các đường dẫn hệ thống tập tin - và bạn không thể thoát chính xác đường dẫn mới, bạn có thể cho phép tiêm đường dẫn. Việc tiêm đường dẫn có thể cho phép kẻ tấn công lừa chương trình của bạn để xử lý dữ liệu không nên hoặc khiến nó nhầm lẫn khi nghĩ rằng hai uri khác nhau khi chúng thực sự giống hệt nhau nhưng chỉ được mã hóa khác nhau.
Eamon Nerbonne


4
@Stijn: Có: an toàn . Tất cả kiểm tra này là lọc ra các yêu cầu có thể bị hiểu sai bởi mã lỗi (đặc biệt nếu bạn giải mã kép hoặc xây dựng Uri thông qua chuỗi concat và không có mã hóa phù hợp). Bạn không thực hiện bất kỳ loại xử lý nào, do đó, phần lớn sẽ tự động an toàn về phía bạn. Bất kỳ lỗi nào cũng cần có trong mã phục vụ tệp cơ bản của IIS và tôi nghĩ rằng chúng ta có thể giả định rằng đó là trận chiến rất, rất kỹ lưỡng được kiểm tra ngay bây giờ. Một lần nữa, kiểm tra này không có gì lạ mắt, nó chỉ bảo vệ những thứ có thể được giải mã và sau đó trông giống như một uri được mã hóa .
Eamon Nerbonne

2

Tôi chỉ muốn thêm một số thông tin vào câu trả lời của Eamon Nerbonne liên quan đến phần " phải làm gì " trong câu hỏi của bạn (không giải thích về vấn đề cá nhân).
Bạn cũng có thể dễ dàng thay đổi cài đặt của một ứng dụng cụ thể với

  1. mở bảng điều khiển với quyền quản trị viên (Bắt đầu - cmd - nhấp chuột phải, Chạy với tư cách quản trị viên)
  2. gõ vào phần sau (lấy từ đây: http://bloss.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-contained.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (bạn có thể ví dụ như thay thế YOURSITENAMEvới Default Web Siteáp dụng quy tắc này để trang web mặc định)

  3. Nhập, sẵn sàng.

Một ví dụ:

  1. Đầu tiên tôi gặp vấn đề tương tự: Lỗi HTTP 404.11 - Mô-đun lọc yêu cầu được cấu hình để từ chối yêu cầu chứa chuỗi thoát kép.
  2. Gõ vào văn bản được đề cập ở trên: Drupal7-khác Giải pháp cho Lỗi HTTP 404.11 - Mô-đun lọc yêu cầu được định cấu hình để từ chối yêu cầu chứa chuỗi thoát kép.
  3. Bây giờ nó hoạt động như mong đợi: Giải pháp cho Lỗi HTTP 404.11 - Mô-đun lọc yêu cầu được định cấu hình để từ chối yêu cầu chứa chuỗi thoát kép.

1

Bạn đã nghĩ về việc có URL tìm kiếm như '/ search / a / b / c' chưa?

Bạn sẽ cần thiết lập một tuyến đường như

search/{*path}

Và sau đó trích xuất các giá trị tìm kiếm từ chuỗi đường dẫn của bạn trong hành động.

HTHs
Charles


Vấn đề là các ký tự được mã hóa URL khác (bao gồm chính '/') có thể là một phần của tìm kiếm.
Alex

Bạn có thể không mã hóa tất cả '/' thực sự là một phần của tìm kiếm thành '% 2F' không?
Charlino

0

Tôi đã gặp vấn đề này trong IIS 7.5 khi thực hiện Server.TransferRequest () trong một ứng dụng.

Mã hóa tên tệp gây ra sự cố thoát kép, nhưng nếu tôi không mã hóa thì tôi sẽ gặp phải lỗi "Request.Path" nguy hiểm tiềm tàng .

Đặt bất kỳ giao thức nào, thậm chí là một giao thức trống, trên URL tôi chuyển đến Server.TranferRequest () đã khắc phục sự cố.

Không hoạt động:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Làm:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.