O que é injeção de cabeçalho HTTP?

A injeção de cabeçalhos HTTP é um método de ataque que explora vulnerabilidades em aplicações web. Ao inserir strings maliciosas, incluindo caracteres de retorno de carro e avanço de linha (CRLF), em requisições HTTP enviadas ao servidor web, os invasores podem manipular as respostas HTTP. Aplicações web que armazenam parâmetros fornecidos pelo usuário diretamente nos cabeçalhos de resposta HTTP sem sanitização são particularmente vulneráveis a esse tipo de ataque.

Por exemplo, considere um cenário em que um navegador envia a seguinte solicitação com um parâmetro:

http://f5.com/index.html?status=1

Se a aplicação web quiser usar o parâmetro status=1 para o gerenciamento de sessões, ela poderá retornar uma resposta HTTP como esta:

HTTP/1.1 200 OK
...
Set-Cookie:status=1

Agora, suponha que a requisição seja modificada com a seguinte entrada especialmente elaborada:

http://f5.com/index.html?status=1<CRLF><CRLF><html><body><script>~</script></body></html>

A resposta HTTP do aplicativo web seria alterada da seguinte forma:

HTTP/1.1 200 OK
...
Set-Cookie:status=1
<linha vazia>
<html><body><script>~</script></body></html>

Em respostas HTTP, qualquer conteúdo após dois caracteres CRLF (linhas em branco) é tratado como o corpo da resposta e renderizado pelo navegador. Se o corpo da resposta incluir JavaScript malicioso, o navegador o executará, o que pode resultar em violações de segurança. Além disso, invasores podem criar entradas para injetar conteúdo no cabeçalho, como:

<CRLF>Set-Cookie:PHPSESSID=abc

Isso definiria um ID de sessão específico no navegador e possibilitaria ataques de fixação de sessão.

Como prevenir a injeção de cabeçalhos HTTP:

  • Sanitização: valide e sanitize os parâmetros recebidos nos cabeçalhos das solicitações HTTP para neutralizar strings maliciosas.
  • Web Application Firewall (WAF): Como é difícil sanitizar todas as aplicações web de forma consistente, implantar um WAF é uma solução eficaz. Um WAF monitora o tráfego da camada de aplicação e pode bloquear solicitações identificadas como ataques, reduzindo assim os riscos de injeção de cabeçalho HTTP.