Gérer correctement la demande IIS avec le pourcentage de connexion dans l'URL (/%)

14

Je recherche tout type de solution pour obtenir correctement une demande IIS telle que /programming//% et http://bing.com/% pour ne pas afficher une page 400 Bad Request, mais afficher une page d'erreur personnalisée similaire à la façon dont http://google.com/% et http://facebook.com/% font (évidemment ces exemples ne sont pas sur IIS).

Je crois que j'ai essayé de définir tous les paramètres de registre http.sys applicables (AllowRestrictedChars, PercentUAllowed) par http://support.microsoft.com/kb/820129 mais cela n'a pas aidé. La définition de AllowRestrictedChars et d'une page 400 personnalisée a des URL fixes telles que /programming//%12 mais pas /%.

bkaid
la source
3
Vous vous rendez compte qu'il s'agit d'un échappement URL incomplet et qu'il s'agit d'une mauvaise demande, alors 400 le gère correctement? PercentU et AllowRestricted ne sont pas vraiment applicables
Rup
Oui, je le fais (et /% n'est qu'un exemple d'URL, mais évidemment l'erreur se produit avec chaque caractère d'échappement invalide). IIS gère le 400, mais je veux afficher une page 400 personnalisée comme je peux avec d'autres codes d'état dans IIS, et comment les serveurs non IIS peuvent le faire pour 400.
bkaid
J'ai des liens puissants pointant vers mes sites Web qui sont encodés à tort comme ceci. mais je ne suis pas autorisé à les 301 à la bonne page, au lieu de cela, c'est une erreur grave. C'est inacceptable.
boomhauer

Réponses:

20

Ceci est bloqué directement au niveau du noyau IIS. En tant que test, j'ai retiré chaque module dans IIS afin qu'il n'ait même pas de gestionnaire de page statique et qu'il affiche toujours le message d'erreur 400.

Je ne pense pas qu'il soit possible avec IIS de contourner cela. Les paramètres de registre que vous avez mentionnés concernent d'autres types de caractères restreints. Je n'ai pas vu de levier pour changer cette fonctionnalité.

Quel est votre objectif d'éviter cela? Cela ouvre votre surface d'attaque plus large, et je ne peux pas imaginer qu'un visiteur légitime soit perdu à la suite du blocage de séquences d'échappement URL incomplètes.

Update2: Voici trois excellents liens à ce sujet. Nazim Lala et Wade Hilmo de l'équipe IIS ont blogué à ce sujet en raison de la discussion autour de votre question. Scott Hanselman a également un excellent article sur la partie chaîne de requête dans .NET:

Mise à jour: j'ai vérifié auprès d'un membre de l'équipe IIS pour obtenir une réponse faisant autorité. Il a mentionné que le% est considéré comme un caractère dangereux selon RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).

Voici le texte pertinent:

Peu sûr:

Les caractères peuvent être dangereux pour plusieurs raisons. Le caractère d'espace n'est pas sûr car des espaces importants peuvent disparaître et des espaces insignifiants peuvent être introduits lorsque les URL sont transcrites ou composées ou soumises au traitement de programmes de traitement de texte. Les caractères "<" et ">" ne sont pas sûrs car ils sont utilisés comme délimiteurs autour des URL dans le texte libre; le guillemet ("" ") est utilisé pour délimiter les URL dans certains systèmes. Le caractère" # "n'est pas sûr et doit toujours être codé car il est utilisé dans le World Wide Web et dans d'autres systèmes pour délimiter une URL à partir d'un fragment / ancre identifiant qui pourrait le suivre. Le caractère "%" n'est pas sûr car il est utilisé pour les encodages d'autres caractères. D'autres caractères ne sont pas sûrs car les passerelles et autres agents de transport sont connus pour parfois modifier ces caractères. Ces caractères sont "{", "}", "|", "\", "^", "~", "[", "]" et "` ".

Tous les caractères dangereux doivent toujours être codés dans une URL. Par exemple, le caractère "#" doit être codé dans les URL, même dans les systèmes qui ne traitent pas normalement les identifiants de fragment ou d'ancrage, de sorte que si l'URL est copiée dans un autre système qui les utilise, il ne sera pas nécessaire de modifier le Encodage URL.

IIS bloque donc de manière proactive ce problème au niveau principal, une mesure de sécurité proactive pour minimiser leur surface d'attaque.

Scott Forsyth - MVP
la source
Je préfère me connecter correctement et gérer toutes les erreurs moi-même pour surveiller toute combinaison étrange non valide d'URL invalides qui sont générées dynamiquement sur mon site - dans le cas où une URL ne s'échapperait pas correctement.
bkaid
1
Il y a quelque chose à dire pour gérer les erreurs vous-même, mais si les échecs manifestement évidents sont traités pour vous, c'est un bon bonus. IIS ne doit pas autoriser les caractères qui ne correspondent pas à un fichier ou un dossier dans le système de fichiers NTFS. Il ne saurait pas quoi faire du chemin du dossier. Si ce n'est pas un modèle de caractère qui équivaut à un caractère valide, il devra alors décider quoi faire. Dans ce cas, il semble qu'il était dédié à bloquer plutôt qu'à ignorer les caractères invalides.
Scott Forsyth - MVP
@thekaido Comme Scott l'a dit, il n'est pas logique d'analyser les URL incomplètes. Quel type de page d'erreur personnalisée pouvez-vous faire puisque vous n'avez aucune idée de ce que l'utilisateur essayait de faire (car la demande est incomplète). Notez qu'IE9 ne vous permettra même pas d'accéder au serveur avec une demande incomplète
Jim B
Je comprends les implications de toutes ces choses, mais Apache et d'autres serveurs Web le permettent, tout comme IIS. Les URL incorrectement échappées sont les seules URL que IIS ne vous laissera pas gérer à ma connaissance. IIS doit autoriser et autorise d'autres caractères qui ne sont pas mappés au système de fichiers NTFS car mon site est créé à l'aide d'ASP.NET MVC où les demandes seront acheminées vers des ressources non basées sur des fichiers.
bkaid
En fait, je me tiens corrigé sur le% dans NTFS. C'est autorisé, avec la plupart des autres personnages: en.wikipedia.org/wiki/Ntfs . (recherchez les caractères autorisés dans les noms de fichiers).
Scott Forsyth - MVP
3

Je peux penser à 3 façons possibles

  1. Modifier IIS pour pointer vers une page personnalisée pour 400 erreurs par rapport à la normale

  2. Si cela est unique à un site Web spécifique dans IIS, vous pouvez faire quelque chose comme ça dans le web.config:

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

  3. Écrivez un httpModule qui inspecte les URL entrantes et les gère

Dave Wise
la source
4
Aucun de ces travaux - IIS ne transmet jamais la demande.
bkaid
L'option # 1 devrait fonctionner quoi qu'il arrive, car c'est ainsi que IIS répond à l'erreur
Dave Wise
4
Je viens de réessayer les options 1 et 2 et aucune d'entre elles ne fonctionne. IIS traite cette demande spécialement comme le mentionne Scott.
bkaid
3

La seule solution consiste à vérifier l'URL avant que le noyau IIS ne le puisse.

Vous devez envoyer vos liens générés dynamiquement via un script pour les vérifier avant de transférer votre utilisateur final vers cette URL ...

En dehors de cela, vous savez que c'est la seule situation où IIS ne le traitera pas comme vous le souhaitez. Donc, par processus d'élimination, si vous avez une demande non traitée, vous savez ce qui l'a provoquée.

Peut-être que la vérification du référent dans une page 400 personnalisée aiderait à réduire la source du trafic?

Garrett
la source
2

Ce message sur le forum IIS indique que HTTP 400 (Bad Request) est bloqué par http.sys et ne parvient pas à IIS qui correspond aux liens que @Scott Forsyth - MVP a inclus dans sa réponse d'origine.

Vous pouvez voir un journal de ces demandes sous c: \ Windows \ System32 \ LogFiles \ HTTPERR \

Je ne sais pas si vous pouvez configurer la page de réponse qui est renvoyée à l'utilisateur pour ce type d'erreur, mais puisque même Bing souffre de ce problème, je soupçonne que ce n'est pas possible ou nécessiterait des horribles hacks système.

Hector Correa
la source