Não permitir métodos HTTP no Tomcat é sensível a maiúsculas e minúsculas?

11

Eu coloquei o seguinte no web.xml do meu aplicativo para tentar proibir PUT, DELETE, etc:

 <security-constraint>
 <web-resource-collection>
  <web-resource-name>restricted methods</web-resource-name>
  <url-pattern>/*</url-pattern>
  <http-method>DELETE</http-method>
  <http-method>PUT</http-method>
  <http-method>SEARCH</http-method>
  <http-method>COPY</http-method>
  <http-method>MOVE</http-method>
  <http-method>PROPFIND</http-method>
  <http-method>PROPPATCH</http-method>
  <http-method>MKCOL</http-method>
  <http-method>LOCK</http-method>
  <http-method>UNLOCK</http-method>
  <http-method>delete</http-method>
  <http-method>put</http-method>
  <http-method>search</http-method>
  <http-method>copy</http-method>
  <http-method>move</http-method>
  <http-method>propfind</http-method>
  <http-method>proppatch</http-method>
  <http-method>mkcol</http-method>
  <http-method>lock</http-method>
  <http-method>unlock</http-method>
 </web-resource-collection>
 <auth-constraint />
 </security-constraint>

Ok, agora:

Se eu fizer um pedido com o método DELETE , recebo um 403.

Se eu fizer um pedido com o método delete , recebo um 403.

MAS

Se eu fizer uma solicitação com o método DeLeTe , obtenho OK!

Como posso proibir essas maiúsculas / minúsculas?

Edit: estou testando com um programa em C #:

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "making request";
        System.Threading.Thread.Sleep(400);
        WebRequest req = WebRequest.Create("http://serverurl/Application/cache_test.jsp");
        req.Method = txtMethod.Text;
        try
        {
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            textBox1.Text = "Status: " + resp.StatusCode;

            if (resp.StatusCode == System.Net.HttpStatusCode.OK)
            {
                WebHeaderCollection header = resp.Headers;
                using (System.IO.StreamReader reader = new System.IO.StreamReader(resp.GetResponseStream(), ASCIIEncoding.ASCII))
                {
                    //string responseText = reader.ReadToEnd();
                    textBox1.Text += "\r\n" + reader.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            textBox1.Text = ex.Message;
        }
    }

txtMethod.Text é uma caixa de texto onde estou digitando o nome do método. Quando há um 403, é lançada uma exceção que é capturada no bloco catch.

O cache_test.jsp contém:

<%
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");

out.print("Method used was: "+request.getMethod());
%>
    
por developerwjk 27.01.2015 / 00:07

2 respostas

13

Independentemente do comportamento incorreto do Tomcat em relação ao padrão HTTP, você deve usar uma lista de permissões para permitir métodos específicos em vez de uma lista negra.

Por exemplo, a lista de permissões a seguir bloqueará todos os métodos, exceto o diferencia maiúsculas de minúsculas GET e HEAD .

<security-constraint>
    <web-resource-collection>
        <web-resource-name>restricted methods</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>HEAD</http-method-omission>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

(Observação: exige o Tomcat 7+. Os usuários de versões mais antigas precisarão investigar outras soluções, por exemplo, um filtro de servlet.)

Ref

    
por 27.01.2015 / 06:18
13

Bem, após testes rápidos em alguns servidores aleatórios contendo Server: Apache-Coyotte assinatura de cabeçalhos em suas respostas HTTP, parece que você está certo ao enviar get / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n com uma conexão netcat simples toda vez que um código HTTP 400 deveria ter sido recebido .

Por exemplo:

$ { echo -en "get / HTTP/1.1\r\nHost: <target_IP>:8080\r\n\r\n" ; } | nc <target_IP> 8080

01:14:58.095547 IP 192.168.1.3.57245 > <target_IP>.8080: Flags [P.], seq 1:42, ack 1, win 115, options [nop,nop,TS val 4294788321 ecr 0], length 41
E..]C.@[email protected].......
..D.....get / HTTP/1.1
Host: <target_IP>:8080

[...]

01:14:58.447946 IP <target_IP>.8080 > 192.168.1.3.57245: Flags [.], seq 1:1409, ack 43, win 65494, options [nop,nop,TS val 7981294 ecr 4294787971], length 1408
E...f...i.....p.............A..............
.y....C.HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Tue, 27 Jan 2015 00:15:14 GMT

Devo dizer que estou um pouco chocado aqui e não ficaria surpreso em ver esse comportamento estendido a todos os métodos HTTP / 1.1 nesse caso.

Você deve preencher um relatório de bug na sua ferramenta de acompanhamento de bugs e enviar um e-mail para o lista de e-mails porque essa é uma violação feia do RFC 2616 (veja abaixo) com más conseqüências.

5.1.1 Method

  The Method  token indicates the method to be performed on the
  resource identified by the Request-URI. The method is case-sensitive.

      Method         = "OPTIONS"                ; Section 9.2
                     | "GET"                    ; Section 9.3
                     | "HEAD"                   ; Section 9.4
                     | "POST"                   ; Section 9.5
                     | "PUT"                    ; Section 9.6
                     | "DELETE"                 ; Section 9.7
                     | "TRACE"                  ; Section 9.8
                     | "CONNECT"                ; Section 9.9
                     | extension-method
      extension-method = token
    
por 27.01.2015 / 00:59

Tags