Prawidłowo obsłuż żądanie IIS z procentowym adresem URL logowania (/%)

14

Szukam wszelkiego rodzaju rozwiązania, aby poprawnie uzyskać żądanie IIS, takiego jak /programming//% i http://bing.com/%, aby nie wyświetlać strony z 400 błędnymi żądaniami , ale wyświetlać niestandardową stronę błędu podobnie jak http://google.com/% i http://facebook.com/% (oczywiście tych przykładów nie ma w IIS).

Wydaje mi się, że próbowałem ustawić wszystkie odpowiednie ustawienia rejestru http.sys (AllowRestrictedChars, PercentUAllowed) na stronie http://support.microsoft.com/kb/820129, ale to nie pomogło. Ustawienie AllowRestrictedChars i niestandardowej strony 400 ma stałe adresy URL, takie jak /programming//%12, ale nie /%.

bkaid
źródło
3
Zdajesz sobie sprawę, że jest to niekompletna zmiana adresu URL i złe żądanie, więc 400 poprawnie je obsługuje? PercentU i AllowRestricted nie mają zastosowania
Rup
Tak, robię (a /% to tylko przykładowy adres URL, ale oczywiście błąd występuje przy każdym nieprawidłowym znaku zmiany znaczenia). IIS operująca 400, ale chcę pokazać niestandardową stronę 400 jak mogę z innych kodów stanu w IIS, a nie jak jak serwery IIS dla 400.
bkaid
Mam kilka potężnych linków prowadzących do moich stron, które są błędnie zakodowane w ten sposób. ale nie wolno mi 301 wejść na właściwą stronę, zamiast tego jest to poważny błąd. to jest niedopuszczalne.
boomhauer

Odpowiedzi:

20

Jest to zablokowane bezpośrednio na poziomie jądra IIS. Jako test wyciągnąłem każdy moduł w IIS, aby nie miał nawet statycznego modułu obsługi strony i nadal wyświetlał komunikat o błędzie 400.

Nie sądzę, aby IIS mógł to obejść. Wspomniane ustawienia rejestru dotyczą innych typów znaków zastrzeżonych. Nie widziałem dźwigni do zmiany tej funkcjonalności.

Jaki jest twój cel, aby tego uniknąć? Powoduje to szersze otwarcie powierzchni ataku i nie wyobrażam sobie, aby prawdziwy użytkownik został utracony w wyniku zablokowania niekompletnych sekwencji ucieczki adresów URL.

Aktualizacja 2: Oto trzy świetne linki na ten temat. Zarówno Nazim Lala, jak i Wade Hilmo z zespołu IIS pisali o tym na blogu z powodu dyskusji wokół twojego pytania. Również Scott Hanselman ma świetny post na temat querystring w .NET:

Aktualizacja: skontaktowałem się z członkiem zespołu IIS, aby uzyskać wiarygodną odpowiedź. Wspomniał, że% jest uważany za niebezpieczny znak zgodnie z RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).

Oto właściwy tekst:

Niebezpieczny:

Znaki mogą być niebezpieczne z wielu powodów. Znak spacji jest niebezpieczny, ponieważ znaczące spacje mogą zniknąć, a nieznaczne spacje mogą zostać wprowadzone, gdy adresy URL są transkrybowane, składane lub poddawane obróbce programów do edycji tekstu. Znaki „<” i „>” są niebezpieczne, ponieważ są używane jako ograniczniki wokół adresów URL w tekście swobodnym; znak cudzysłowu („” „) jest używany do ograniczania adresów URL w niektórych systemach. Znak„ # ”jest niebezpieczny i zawsze powinien być kodowany, ponieważ jest używany w sieci WWW i innych systemach do ograniczania adresu URL z fragmentu / kotwicy identyfikator, który może za nim podążać. Znak „%” jest niebezpieczny, ponieważ jest używany do kodowania innych znaków. Inne znaki są niebezpieczne, ponieważ wiadomo, że bramy i inne środki transportu modyfikują takie znaki. Te znaki to „{”, „}”, „|”, „\”, „^”, „~”, „[”, „]” i „'”.

Wszystkie niebezpieczne znaki muszą zawsze być zakodowane w adresie URL. Na przykład znak „#” musi być zakodowany w adresach URL, nawet w systemach, które normalnie nie obsługują fragmentów lub identyfikatorów zakotwiczenia, aby w przypadku skopiowania adresu URL do innego systemu, który ich używa, nie trzeba zmieniać Kodowanie adresów URL.

IIS aktywnie blokuje to na poziomie podstawowym, proaktywny środek bezpieczeństwa w celu zminimalizowania powierzchni ataku.

Scott Forsyth - MVP
źródło
Wolę poprawnie rejestrować i obsługiwać wszystkie błędy, aby monitorować każdą nieprawidłową dziwną kombinację nieprawidłowych adresów URL, które są dynamicznie generowane w mojej witrynie - w przypadku, gdy nie udało się poprawnie uniknąć zmiany adresu URL.
bkaid
1
Jest coś do powiedzenia na temat samodzielnego radzenia sobie z błędami, ale jeśli rażąco oczywiste awarie zostaną rozwiązane, jest to niezła premia. Usługi IIS nie powinny przepuszczać znaków, które nie odpowiadają plikom lub folderom w systemie plików NTFS. Nie wiedziałby, co zrobić ze ścieżką folderu. Jeśli nie jest to wzór znaków równy prawidłowemu znakowi, musiałby podjąć decyzję, co zrobić. W tym przypadku wygląda na to, że był przeznaczony do blokowania, a nie ignorowania niepoprawnych znaków.
Scott Forsyth - MVP
@ theheido Jak powiedział Scott, nie ma sensu analizować niepełnych adresów URL. Jaki rodzaj niestandardowej strony błędu możesz zrobić, ponieważ nie masz pojęcia, co użytkownik próbował zrobić (ponieważ żądanie jest niekompletne). Pamiętaj, że IE9 nawet nie pozwoli ci dostać się na serwer z niekompletnym żądaniem
Jim B
Rozumiem implikacje wszystkich tych rzeczy, ale Apache i inne serwery WWW zezwalają na to, podobnie jak IIS. Niepoprawnie ocalone adresy URL to jedyne adresy URL IIS, które nie pozwalają na obsługę, o której wiem. Usługi IIS powinny i zezwalają na inne znaki, które nie są mapowane do systemu plików NTFS, ponieważ moja witryna została zbudowana przy użyciu programu ASP.NET MVC, w którym żądania będą kierowane do zasobów nieopartych na plikach.
bkaid
Właściwie mam poprawione o% w NTFS. Jest to dozwolone wraz z większością innych postaci: en.wikipedia.org/wiki/Ntfs . (wyszukaj Dozwolone znaki w nazwach plików).
Scott Forsyth - MVP
3

Mogę wymyślić 3 możliwe sposoby

  1. Zmień usługi IIS, aby wskazywały niestandardową stronę pod kątem 400 błędów, niż zwykle

  2. Jeśli jest to unikalne dla określonej strony internetowej w IIS, możesz zrobić coś takiego w web.config:

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

  3. Napisz moduł httpModule, który sprawdza przychodzące adresy URL i obsługuje je

Dave Wise
źródło
4
Żadna z tych prac - IIS nigdy nie przekazuje żądania.
bkaid
Opcja nr 1 powinna działać bez względu na wszystko, ponieważ w ten sposób IIS reaguje na błąd
Dave Wise
4
Właśnie wypróbowałem ponownie opcje 1 i 2 i żadne z nich nie działa. IIS obsługuje tę prośbę specjalnie, jak wspomina Scott.
bkaid
3

Jedynym sposobem na obejście tego jest sprawdzenie adresu URL, zanim jądro IIS będzie mogło.

Musisz przesłać dynamicznie generowane linki za pomocą skryptu, aby je sprawdzić przed przekazaniem użytkownika końcowego na ten adres URL ...

Poza tym wiesz, że jest to jedyna sytuacja, w której IIS nie poradzi sobie z tym tak, jak chcesz. Tak więc, poprzez proces eliminacji, jeśli masz nieobsługiwane żądanie, wiesz, co je spowodowało.

Być może sprawdzenie odsyłacza na niestandardowej stronie 400 pomogłoby zawęzić źródło ruchu?

Garrett
źródło
2

Ten post na forum IIS wskazuje, że HTTP 400 (Bad Request) jest blokowany przez http.sys i nie trafia do IIS, który pasuje do linków, które @Scott Forsyth - MVP umieścił w swojej oryginalnej odpowiedzi.

Możesz zobaczyć dziennik tych żądań pod c: \ Windows \ System32 \ LogFiles \ HTTPERR \

Nie wiem, czy możesz skonfigurować stronę odpowiedzi, która jest odsyłana do użytkownika z powodu tego rodzaju błędu, ale ponieważ nawet Bing cierpi z powodu tego problemu, podejrzewam, że albo nie jest to możliwe, albo wymagałoby okropnych włamań systemowych.

Hector Correa
źródło