Xử lý đúng yêu cầu IIS với phần trăm đăng nhập url (/%)


14

Tôi đang tìm bất kỳ loại giải pháp nào để nhận đúng yêu cầu IIS như /programming//%http://bing.com/% để không hiển thị trang 400 Yêu cầu xấu, nhưng hiển thị trang lỗi tùy chỉnh tương tự như cách http://google.com/%http://facebook.com/% làm (rõ ràng những ví dụ đó không có trên IIS).

Tôi tin rằng tôi đã thử cài đặt tất cả các cài đặt đăng ký http.sys có thể áp dụng (AllowRestrictedChars, PercentU ALLowed) cho mỗi http://support.microsoft.com/kb/820129 nhưng điều đó không có ích. Đặt AllowRestrictedChars và một trang 400 tùy chỉnh có các url cố định, chẳng hạn như /programming//%12 nhưng không /%.


3
Bạn nhận ra rằng đó là một lối thoát URL không đầy đủ và là một yêu cầu xấu, vì vậy 400 đang xử lý nó đúng cách? PercentU và AllowRestricted không thực sự áp dụng
Rup

Có tôi làm (và /% chỉ là một URL ví dụ, nhưng rõ ràng lỗi xảy ra với mọi ký tự thoát không hợp lệ). IIS đang xử lý 400, nhưng tôi muốn hiển thị một trang 400 tùy chỉnh như tôi có thể với các mã trạng thái khác trong IIS và giống như cách các máy chủ không phải IIS có thể cho 400.
bkaid

Tôi có một số liên kết mạnh mẽ trỏ đến các trang web của tôi bị mã hóa nhầm như thế này. nhưng tôi không được phép 301 chúng vào đúng trang, thay vào đó là một lỗi khó. Điều này là không thể chấp nhận được.
boomhauer

Câu trả lời:


20

Điều này bị chặn ngay trong cấp nhân IIS. Để kiểm tra, tôi đã rút ra mọi mô-đun trong IIS để nó thậm chí không có trình xử lý trang tĩnh và nó vẫn hiển thị thông báo lỗi 400.

Tôi không tin rằng IIS có thể khắc phục điều đó. Các cài đặt đăng ký mà bạn đề cập là dành cho các loại ký tự bị hạn chế khác. Tôi chưa thấy một đòn bẩy để thay đổi chức năng đó.

Mục tiêu của bạn là gì để tránh điều đó? Nó mở ra bề mặt tấn công của bạn rộng hơn và tôi không thể tưởng tượng được một khách truy cập hợp pháp bị mất do bị chặn các chuỗi thoát URL không hoàn chỉnh.

Update2: Đây là ba liên kết tuyệt vời về điều này. Cả Nazim Lala và Wade Hilmo từ nhóm IIS đã viết blog về điều này vì các cuộc thảo luận xung quanh câu hỏi của bạn. Ngoài ra Scott Hanselman có một bài viết tuyệt vời về phần chuỗi truy vấn trong .NET:

Cập nhật: Tôi đã kiểm tra với một thành viên của nhóm IIS để nhận được câu trả lời có thẩm quyền. Ông đã đề cập rằng% được coi là một ký tự không an toàn theo RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).

Đây là văn bản có liên quan:

Không an toàn:

Nhân vật có thể không an toàn vì một số lý do. Ký tự khoảng trắng không an toàn vì các khoảng trắng đáng kể có thể biến mất và các khoảng trắng không đáng kể có thể được đưa vào khi URL được sao chép hoặc sắp chữ hoặc chịu sự điều trị của các chương trình xử lý văn bản. Các ký tự "<" và ">" không an toàn vì chúng được sử dụng làm dấu phân cách xung quanh các URL trong văn bản miễn phí; dấu ngoặc kép ("" ") được sử dụng để phân định URL trong một số hệ thống. Ký tự" # "không an toàn và phải luôn được mã hóa vì nó được sử dụng trong World Wide Web và trong các hệ thống khác để phân định URL từ một đoạn / neo định danh có thể theo nó. Ký tự "%" không an toàn vì được sử dụng để mã hóa các ký tự khác. Các ký tự khác không an toàn vì các cổng và các tác nhân vận chuyển khác đôi khi được biết là sửa đổi các ký tự đó. Các ký tự này là "{", "}", "|", "\", "^", "~", "[", "]" và "` ".

Tất cả các ký tự không an toàn phải luôn được mã hóa trong một URL. Ví dụ: ký tự "#" phải được mã hóa trong các URL ngay cả trong các hệ thống thường không xử lý các mã định danh phân đoạn hoặc neo, do đó, nếu URL được sao chép vào một hệ thống khác sử dụng chúng, sẽ không cần thiết phải thay đổi Mã hóa URL.

Vì vậy, IIS chủ động chặn điều này ở cấp độ cốt lõi, một biện pháp bảo mật chủ động để giảm thiểu bề mặt tấn công của họ.


Tôi thích tự mình đăng nhập và tự xử lý tất cả các lỗi để theo dõi bất kỳ sự kết hợp lạ nào của các url không hợp lệ đang được tạo động trên trang web của tôi - trong trường hợp người ta không thoát được url đúng.
bkaid

1
Có điều gì đó để nói về việc tự xử lý các lỗi, nhưng nếu các lỗi rõ ràng rõ ràng được xử lý cho bạn, đó là một phần thưởng tuyệt vời. IIS không nên cho phép các ký tự thông qua đó không tương ứng với một tệp hoặc thư mục trong hệ thống tệp NTFS. Nó sẽ không biết phải làm gì với đường dẫn thư mục. Nếu đó không phải là một mẫu ký tự bằng với một ký tự hợp lệ, thì nó sẽ cần đưa ra quyết định về những việc cần làm. Trong trường hợp này, có vẻ như nó được dành riêng để chặn chứ không bỏ qua các ký tự không hợp lệ.
Scott Forsyth - MVP

@thekaido Như Scott đã nói không có nghĩa là phân tích URL không đầy đủ. Bạn có thể tạo loại trang lỗi tùy chỉnh nào vì bạn không biết người dùng đang cố làm gì (vì yêu cầu không đầy đủ). Lưu ý rằng IE9 thậm chí sẽ không cho phép bạn truy cập máy chủ với yêu cầu chưa hoàn tất
Jim B

Tôi hiểu ý nghĩa của tất cả những điều này nhưng Apache và các máy chủ web khác cho phép nó cũng như IIS. URL thoát không đúng cách là IIS duy nhất của URL sẽ không cho phép bạn xử lý những gì tôi biết. IIS nên và không cho phép các ký tự khác không ánh xạ tới hệ thống tệp NTFS vì trang web của tôi được xây dựng bằng ASP.NET MVC nơi các yêu cầu sẽ được chuyển đến các tài nguyên không dựa trên tệp.
bkaid

Trên thực tế, tôi đứng chính xác về% trong NTFS. Nó được phép, cùng với hầu hết các nhân vật khác: en.wikipedia.org/wiki/Ntfs . (tìm kiếm các ký tự được phép trong tên tệp).
Scott Forsyth - MVP

3

Tôi có thể nghĩ ra 3 cách có thể

  1. Thay đổi IIS để trỏ đến một trang tùy chỉnh cho 400 lỗi so với bình thường

  2. Nếu đây là duy nhất cho một trang web cụ thể trong IIS, bạn có thể làm một cái gì đó như thế này trong web.config:

    <customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
    <error statusCode = "400" redirect = "myCustom400Error.aspx" />
    </ customErrors>

  3. Viết một httpModule kiểm tra các URL đến và xử lý chúng


4
Không ai trong số này làm việc - IIS không bao giờ chuyển yêu cầu.
bkaid

Tùy chọn # 1 sẽ hoạt động bất kể là gì vì đó là cách IIS phản hồi lỗi
Dave Wise

4
Tôi vừa thử lại tùy chọn 1 và # 2 và cả hai đều không hoạt động. IIS đang xử lý yêu cầu này đặc biệt như Scott đề cập.
bkaid

3

Cách duy nhất xung quanh điều này nghe có vẻ như kiểm tra URL trước khi nhân IIS có thể.

Bạn cần gửi các liên kết được tạo động của mình thông qua tập lệnh để kiểm tra chúng trước khi chuyển tiếp người dùng cuối của bạn tới URL đó ...

Chặn điều đó, bạn biết đây là tình huống duy nhất mà IIS sẽ không xử lý nó theo cách bạn muốn. Vì vậy, bằng quá trình loại bỏ, nếu bạn có một yêu cầu chưa được xử lý, bạn biết điều gì đã gây ra nó.

Có lẽ kiểm tra người giới thiệu trong một trang 400 tùy chỉnh sẽ giúp thu hẹp nguồn lưu lượng?


2

Đây bài trên diễn đàn IIS chỉ ra rằng HTTP 400 (Yêu cầu xấu) bị chặn bởi http.sys và không truy cập vào IIS khớp với các liên kết mà @Scott Forsyth - MVP có trong câu trả lời ban đầu của anh ấy.

Bạn có thể thấy nhật ký của các yêu cầu này trong c: \ Windows \ System32 \ LogFiles \ HTTPERR \

Tôi không biết liệu bạn có thể định cấu hình trang phản hồi được gửi lại cho người dùng đối với các loại lỗi này hay không, nhưng ngay cả khi Bing bị vấn đề này, tôi nghi ngờ rằng điều đó là không thể hoặc sẽ yêu cầu một số hack hệ thống khủng khiếp.

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.