É EnableHeaderChecking = true o suficiente para evitar ataques de injeção cabeçalho HTTP?

StackOverflow https://stackoverflow.com/questions/869361

  •  22-08-2019
  •  | 
  •  

Pergunta

É suficiente para ter [System.Web.Configuration.HttpRuntimeSection.EnableHeaderChecking] ( http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.enableheaderchecking (VS.85) .aspx) conjunto para true (padrão) para evitar totalmente cabeçalho HTTP ataques de injeção como Response Splitting etc.?

Estou perguntando porque uma ferramenta de teste de penetração caixa branca (Fortify) relata explorável http cabeçalho questões de injeção com HttpResponse.Redirect e cookies, mas eu não encontrei uma maneira de realizar com sucesso um ataque. ( Editar : .. e temos EnableHeaderChecking ligado ..)

Foi útil?

Solução

Eu estive olhando isso há algum tempo e agora tirar a conclusão de que a definição de EnableHeaderChecking para true é de fato bom o suficiente para evitar http header ataques de injeção.

Olhando para 'reflete' código ASP.NET, descobri que:

  1. Há apenas uma maneira de adicionar personalizado cabeçalhos HTTP a uma resposta HTTP, ou seja, usando o HttpResponse.AppendHeader método
  2. HttpResponse.AppendHeader quer
    • cria instâncias de HttpResponseHeader (interno)
    • ou chamadas HttpResponseHeader.MaybeEncodeHeader (para IIS7WorkerRequests)
    • ou cessionários suas respectivas propriedades (por cabeçalhos conhecidos como RedirectLocation ou ContentType )
  3. casos HttpResponseHeader são criados antes de cabeçalhos conhecidos como RedirectLocation ou ContentType são enviados (HttpResponse.GenerateResponseHeaders )
  4. As verificações construtor HttpResponseHeader o EnableHeaderChecking definição e chamadas HttpResponseHeader.MaybeEncodeHeader quando ajustado para true
  5. HttpResponseHeader.MaybeEncodeHeader codifica corretamente caracteres de nova linha que faz HTTP cabeçalho ataques de injeção impossível

Aqui está um trecho de aproximadamente demonstram como eu testei:

// simple http response splitting attack
Response.AddHeader("foo", "bar\n" + 
    // injected http response, bad if user provided
    "HTTP/1.1 200 OK\n" + 
    "Content-Length: 19\n" +
    "Content-Type: text/html\n\n" +
    "<html>danger</html>"
);

O acima só funciona se você ligar explicitamente EnableHeaderChecking off:

<httpRuntime enableHeaderChecking="false"/>

Fortify simplesmente não leva em conta a configuração (configuração EnableHeaderChecking explicitamente não teve nenhum efeito) e, portanto, sempre relata este tipo de questões.

Outras dicas

AFAIK é o suficiente e deve ser ativado por padrão.

Eu acho Fortify é só de pensar defesa em profundidade como se você alterar a configuração na implantação etc.

Eu suponho que você não configurá-lo estritamente em sua configuração, se você tem talvez Fortify não é tão inteligente a figura que o nosso.

melhor maneira de confirmar é explorá-lo:)

  • Apenas obter uma cópia do violinista
  • interceptar a solicitação
  • Tente injetar nova linha
  • ver se a nova linha que você acabou de injetada está na resposta HTTP ou não.

EnableHeaderChecking é apenas para dados não confiável. Se você está passando dados diretamente de um cookie em um redirecionamento, talvez os cabeçalhos resultantes são considerados confiáveis ??e \ r \ n valores não são escapou.

Josef, HttpResponse.AppendHeader () não é o único lugar onde os dados não confiáveis ??podem entrar no Response cabeçalhos HTTP.

Os dados do atacante que acaba em cookies ou HTTP redirecionamentos pode escrever novos cabeçalhos se os dados contém um retorno de carro (ou qualquer coisa que é interpretado como um retorno de carro).

Em geral, é uma melhor utilização muito do seu tempo para validar seus dados do que para sentar e tentar descobrir façanhas. As possibilidades são, os hackers vão ser melhor nisso do que eu ou você está.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top