IIS 7 - Ativando negar seqüências de url com barras invertidas

2

Estou tentando restringir barras invertidas \ em URLs por meio da ferramenta de filtragem Solicitação no IIS 7 usando:

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

No entanto, a regra de barra invertida está sendo completamente ignorada? A solicitação de filtragem está definitivamente funcionando, como tentei com strings em vez de uma contrabarra, por exemplo contact-us como uma regra de negação envia-o corretamente para uma página 404. Mas por que ignorar a barra invertida? Há algo faltando aqui?

Obrigado pela sua ajuda

    
por Duane 16.08.2012 / 15:30

1 resposta

4

Eu olhei para um problema semelhante recentemente e descobri que as barras invertidas estavam sendo substituídas por barras invertidas pelo HTTP.sys antes que as solicitações fossem transferidas para o IIS. Portanto, o módulo de filtragem de solicitações nunca terá a chance de bloquear a solicitação porque não verá as barras invertidas.

Mais detalhadamente, enviei a seguinte solicitação

$ wget "http://www.example.com/awesome-category\awesome-products/"
--2012-08-22 12:51:31-- hhttp://www.example.com/awesome-category%5Cawesome-products/
Resolving www.example.com... 192.168.1.77
Connecting to www.example.com|192.168.1.77|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 56398 (55K) [text/html]
Saving to: 'index.html'

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

E o seguinte apareceu no Wireshark:

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

Eu também configuro Rastreamento de eventos HTTP.sys para ver o que estava acontecendo antes que o HTTP.sys entregasse a solicitação para o IIS & .NET.

Mostrou o URL como sem uma barra invertida:

<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>

Tanto quanto eu posso dizer HTTP.sys está higienizando as barras invertidas no URL, substituindo-os por barras. Esse comportamento foi documentado para o IIS 6 aqui :

The normalization is different when directory traversal is used. For example, the following request is received:

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

Http.sys normalizes this URL as the following URL:

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

Note: The backslash is changed to a forward slash.".

Também é mencionado mais recentemente aqui :

Any ‘\’ (backslashes) in a URI sent to IIS/WAS are automatically converted to a ‘/’ (forward slash). If a relative address is added that contains a ‘\’ and you send IIS a URI that uses the relative address, the backslash is converted to a forward slash and IIS cannot match it to the relative address. IIS sends out trace information that indicates that there are no matches found.

Eu tenho o mesmo comportamento em outro servidor, então eu suspeito que não há como fazer isso com o Request Filtering, em contraste com algumas das documentações no iis.net. Seria ótimo receber uma confirmação mais clara de alguém no MS, mas não consegui encontrar nada.

Editar: alguns dos itens acima estão obsoletos, incompletos ou imprecisos. Consulte esta resposta para ver um exemplo de como reescrever um URL que contém barras invertidas.

    
por 23.08.2012 / 13:05