IIS 7 - 使用反斜杠启用拒绝 url 序列

Dua*_*ane 3 windows-server-2008 iis-7 redirect deny request-filtering

我一直在尝试使用以下方法通过 IIS 7 中的请求过滤工具来限制 URL 中的反斜杠 \:

  <configuration>
   <system.webServer>
      <security>
         <requestFiltering>
            <denyUrlSequences>
               <add sequence="\" />
            </denyUrlSequences>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

然而,反斜杠规则被完全忽略了?请求过滤肯定是有效的,因为我已经尝试过使用字符串而不是反斜杠,例如contact-us,拒绝规则正确地将您发送到 404 页面。但是为什么它忽略了反斜杠?这里有什么遗漏吗?

感谢您的帮助

Jam*_*olt 5

我最近查看了一个类似的问题,发现在将请求移交给 IIS 之前,HTTP.sys 将反斜杠替换为正斜杠。因此,请求过滤模块永远不会有机会阻止请求,因为它不会看到反斜杠。

更详细地说,我发送了以下请求

$ wget " http://www.example.com/awesome-category \awesome-products/"
--2012-08-22 12: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>
Run Code Online (Sandbox Code Playgroud)

据我所知,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 的示例,请参阅此答案