web-dev-qa-db-ja.com

IIS 7-バックスラッシュを使用したURLシーケンスの拒否を有効にする

IIS 7)のリクエストフィルタリングツールを使用して、URLのバックスラッシュ\を制限しようとしています。

  <configuration>
   <system.webServer>
      <security>
         <requestFiltering>
            <denyUrlSequences>
               <add sequence="\" />
            </denyUrlSequences>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>

ただし、バックスラッシュルールは完全に無視されていますか?バックスラッシュの代わりに文字列を試してみたので、リクエストフィルタリングは間違いなく機能しています。 contact-us拒否ルールとして、正しく404ページに移動します。しかし、なぜバックスラッシュを無視するのですか?ここに何か足りないものはありますか?

ご協力ありがとうございました

2
Duane

最近同様の問題を調べたところ、要求がIISに渡される前に、バックスラッシュがHTTP.sysによってスラッシュに置き換えられていたことがわかりました。したがって、リクエストフィルタリングモジュールはバックスラッシュが表示されないため、リクエストをブロックする機会はありません。

詳しくは、以下のリクエストを送信しました

$ wget " http://www.example.com/awesome-category \awesome-products /"
-2012-08-2212:51:31-- hhttp://www.example.com/awesome-category%5Cawesome-products/
www.example.comを解決しています... 192.168.1.77
www.example.comに接続中| 192.168.1.77 |:80 ...接続済み。
HTTPリクエストが送信され、応答を待っています... 200 OK
長さ:56398(55K)[text/html]
保存先:ʻindex.html '

2012-08-22 12:51:38(6.60 MB/s)-ʻindex.html '

そして、以下がWiresharkに表示されました。

4 0.001242000 192.168.200.42 192.168.100.177 HTTP 246 GET/awesome-category%5Cawesome-products/HTTP/1.0

また、 HTTP.sysイベントトレース を設定して、HTTP.sysがIISと.NETに要求を渡す前に何が起こっていたかを確認しました。

URLにバックスラッシュがないことが示されました。

<Event xmlns="http://schemas.Microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-HttpService" Guid="{dd5ef90a-6398-47a4-ad34-4dcecdef795f}" />
        <EventID>2</EventID>
        <Version>0</Version>
        <Level>4</Level>
        <Task>1</Task>
        <Opcode>12</Opcode>
        <Keywords>0x8000000000000002</Keywords>
        <TimeCreated SystemTime="2012-08-22T11:51:29.179726800Z" />
        <Correlation ActivityID="{80000663-0000-5d00-b63f-84710c7967bb}" />
        <Execution ProcessID="4" ThreadID="1912" ProcessorID="0" KernelTime="8820" UserTime="0" />
        <Channel>Microsoft-Windows-HttpService/Trace</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="RequestObj">0xFFFFFA801C33B530</Data>
        <Data Name="HttpVerb">       4</Data>
        <Data Name="Url">http://www.example.com.com:80/awesome-category/awesome-products</Data>
    </EventData>
    <RenderingInfo Culture="en-GB">
        <Level>Information </Level>
        <Opcode>Parse </Opcode>
        <Keywords>
            <Keyword>Flagged on all HTTP events dealing with request processing </Keyword>
        </Keywords>
        <Task>HTTP Request Trace Task </Task>
        <Message>Parsed request (request pointer 0xFFFFFA801C33B530, method 4) with URI http://www.example.com.com:80/awesome-category/awesome-products. </Message>
        <Channel>HTTP Service Channel </Channel>
        <Provider>Microsoft-Windows-HttpService </Provider>
    </RenderingInfo>
</Event>

私が知る限り、HTTP.sysはURLのバックスラッシュをスラッシュに置き換えることでサニタイズしています。この動作は、IIS 6 ここ について文書化されています。

ディレクトリトラバーサルを使用する場合、正規化は異なります。たとえば、次のリクエストを受信します。

http://www.example.com/RootTest/SubDir1 \SubDir2 /../../ SubDir5/SubDir6

Http.sysは、このURLを次のURLとして正規化します。

http://www.example.com/RootTest/SubDir5/SubDir6

注:円記号はスラッシュに変更されます。」.

最近も言及されています ここ

IIS/WASに送信されたURIの「\」(バックスラッシュ)は、自動的に「/」(スラッシュ)に変換されます。 「\」を含む相対アドレスが追加され、IISに相対アドレスを使用するURIを送信すると、円記号はスラッシュに変換され、IISはそれを相対アドレスと一致させることができません。 IISは、一致するものが見つからないことを示すトレース情報を送信します。

別のサーバーでも同じ動作が発生したため、iis.netの一部のドキュメントとは対照的に、リクエストフィルタリングでこれを行う方法はないと思います。 MSの誰かからより明確な確認を得るのは素晴らしいことですが、私は何も見つかりませんでした。

編集:上記のいくつかは、時代遅れ、不完全、または不正確です。バックスラッシュを含むURLを書き換える例については、 この回答 を参照してください。

4
James L