URLのパーセント記号(/%)を使用してIIS要求を適切に処理する


14

/programming//%http://bing.com/%などのIIS要求を適切に取得して、400 Bad Requestページを表示せずにカスタムエラーページを表示するためのあらゆる種類のソリューションを探していますhttp://google.com/%およびhttp://facebook.com/%の動作に似ています(明らかに、これらの例はIISにはありません)。

http://support.microsoft.com/kb/820129ごとに、該当するすべてのhttp.sysレジストリ設定(AllowRestrictedChars、PercentUAllowed)を設定しようとしたが、それは役に立たなかったと思う。AllowRestrictedCharsとカスタム400ページを設定すると、https://stackoverflow.com/%12などの固定URL がありますが、/%はありません。


3
あなたはそれが不完全なURLエスケープであり、悪いリクエストであることに気付いたので、400はそれを適切に処理していますか?PercentUとAllowRestrictedは本当に適用されません
Rupの

はい、そうです(/%はURLの例にすぎませんが、無効なエスケープ文字ごとにエラーが発生することは明らかです)。IISは400を処理しているが、私はIIS内の他のステータスコードでできるようにカスタム400ページを表示したい、そしてどのように非は、IISのようなサーバーは、400のためにすることができます
bkaid

このように誤ってエンコードされたWebサイトを指す強力なリンクがいくつかあります。しかし、私はそれらを正しいページに301することを許可されていません、代わりにハードエラーです。これは受け入れがたい。
ブームハウアー

回答:


20

これは、IISカーネルレベルでブロックされます。テストとして、静的ページハンドラーさえも持たないようにIISのすべてのモジュールを引き出しましたが、それでも400エラーメッセージが表示されました。

IISでそれを回避できるとは思いません。あなたが言及したレジストリ設定は、他の種類の制限文字用です。その機能を変更するためのレバーを見たことはありません。

あなたの目標はそれを避けることですか?それはあなたの攻撃面をより広く開き、不完全なURLエスケープシーケンスをブロックした結果として正当な訪問者が失われることは想像できません。

Update2: これに関する3つの素晴らしいリンクがあります。IISチームのNazim LalaとWade Hilmoの両方が、あなたの質問に関する議論のためにこれについてブログに書いています。また、Scott Hanselmanは、.NET内のクエリ文字列部分に関する素晴らしい投稿をしています。

更新: IISチームのメンバーに確認して、信頼できる回答を得ました。彼は、RFC 1738(http://www.ietf.org/rfc/rfc1738.txt)によると、%は安全でない文字と見なされると述べました。

関連するテキストは次のとおりです。

安全でない:

文字は、いくつかの理由で安全でない場合があります。スペース文字は安全ではありません。URLが文字起こしまたはタイプセットされたり、ワープロプログラムの処理が行われたりすると、重要なスペースが消えたり、意味のないスペースが導入される可能性があるためです。文字「<」および「>」は、フリーテキストのURLの区切り文字として使用されるため、安全ではありません。一部のシステムでは、引用符( "" ")を使用してURLを区切ります。文字"# "は安全ではなく、World Wide Webや他のシステムでURLをフラグメント/アンカーから区切るために使用されるため、常にエンコードする必要がありますそれに従うことがあります。識別子 、それが他の文字のエンコードに使われているため、文字「%」は安全ではありません。 ゲートウェイや他のトランスポートエージェントはこのような文字を変更することがあるため、他の文字は安全ではありません。これらの文字は、「{」、「}」、「|」、「\」、「^」、「〜」、「[」、「]」、および「 `」です。

安全でない文字はすべて、常にURL内でエンコードする必要があります。たとえば、通常はフラグメントまたはアンカー識別子を処理しないシステムでも、文字「#」をURL内でエンコードする必要があります。そのため、URLを使用する別のシステムにURLをコピーしても、変更する必要はありませんURLエンコード。

したがって、IISはこれをコアレベルでプロアクティブにブロックします。これは、攻撃対象を最小限に抑えるプロアクティブなセキュリティ対策です。


私は自分のサイトで動的に生成されている無効なURLの無効な奇妙な組み合わせを監視するために、すべてのエラーを適切にログに記録して処理することを好みます-イベントが適切にエスケープされていない場合
bkaid

1
エラーを自分で処理するために何か言いたいことがありますが、あからさまに明らかな障害があなたのために処理される場合、それは素晴らしいボーナスです。IISは、NTFSファイルシステム内のファイルまたはフォルダーに対応しない文字を許可しません。フォルダーパスをどうするかわかりません。有効な文字に等しい文字パターンでない場合は、何をすべきかを決定する必要があります。この場合、無効な文字を無視するのではなくブロックすることに専念したようです。
スコットフォーサイス

@thekaidoスコットが言ったように、不完全なURLを解析することは意味がありません。ユーザーが何をしようとしていたのかわからないため、どのようなカスタムエラーページを作成できますか(要求が不完全であるため)。IE9でも、あなたは不完全なリクエストでサーバーに入らないことに注意してください
ジム・B

私はこれらすべてのことの意味を理解していますが、Apacheや他のWebサーバーはIISのようにそれを可能にします。不適切にエスケープされたURLは、私が知っているURLをIISで処理できない唯一のURLです。IISは、要求が非ファイルベースのリソースにルーティングされるASP.NET MVCを使用して構築されているため、NTFSファイルシステムにマップしない他の文字を許可する必要があります。
-bkaid

実際、NTFSの%については修正されています。それは、他のほとんどのキャラクターと共に許可されています:en.wikipedia.org/wiki/Ntfs。(ファイル名に使用できる文字を検索します)。
スコットフォーサイス

3

私は3つの可能な方法を考えることができます

  1. 通常よりも400エラーのカスタムページを指すようにIISを変更します

  2. これがIISの特定のWebサイトに固有の場合、web.configで次のようなことができます。

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

  3. 着信URLを検査して処理するhttpModuleを作成します


4
これらはどれも機能しません。IISはリクエストを渡しません。
-bkaid

オプション#1はそれがエラーに応答するIIS方法ですので、何に関係なく動作するはずです
デイブ・ワイズ

4
オプション1と2をもう一度試したところ、どちらも機能しませんでした。IISは、スコットが言及しているように、このリクエストを特別に処理しています。
bkaid

3

これを回避する唯一の方法は、IISカーネルが実行する前にURLをチェックするようなものです。

エンドユーザーをそのURLに転送する前に、動的に生成されたリンクをスクリプトで送信してチェックする必要があります...

それを除けば、IISが希望どおりに処理できない唯一の状況であることがわかります。したがって、除去のプロセスにより、未処理のリクエストがある場合は、それが原因であることがわかります。

カスタム400ページでリファラーをチェックすると、トラフィックのソースを絞り込むのに役立つでしょうか?


2

IISフォーラムのこの投稿は、HTTP 400(Bad Request)がhttp.sysによってブロックされ、@ Scott Forsyth-MVPが元の回答に含めたリンクに一致するIISに到達しないことを示しています。

これらのリクエストのログは、c:\ Windows \ System32 \ LogFiles \ HTTPERR \で確認できます。

この種のエラーに対してユーザーに返される応答ページを構成できるかどうかはわかりませんが、Bingでさえこの問題に苦しんでいるので、それは不可能であるか、恐ろしいシステムハックが必要になると思われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.