Este artigo apresenta alguns problemas de segurança no protocolo HTTP , levantados em dois documentos RFC 7230 e RFC 7231. Exemplos no artigo sobre erros específicos são referenciados no OWASP.
1. Riscos de fatores intermediários
O HTTP permite o uso de intermediários para responder às solicitações através de uma série de conexões. Existem três elementos intermediários comuns: proxy, gateway e túnel.
Uma solicitação ou resposta terá que passar pelos pontos A, B e C. Eles podem acessar informações confidenciais transmitidas, como informações pessoais de usuários ou organizações. A falta de atenção dada à segurança e à privacidade por parte dos intermediários pode levar a uma vasta gama de ataques potenciais.
Os desenvolvedores e desenvolvedores de sistemas devem considerar fatores de privacidade e segurança durante o processo de design, codificação e implantação do sistema.
Os usuários precisam estar cientes dos perigos do uso de proxies ou gateways não confiáveis.
2. Divisão de resposta
A divisão de resposta (também conhecida como injeção CRLF) é uma técnica popular de exploração da web. O invasor envia dados codificados, em alguns parâmetros da solicitação, que são então decodificados e repetidos em determinado campo do cabeçalho da resposta.
Se esses dados forem um símbolo que representa o fim da resposta e uma resposta subsequente for iniciada, a resposta original será dividida em duas e o conteúdo da segunda resposta será controlado pelo invasor. O invasor pode então fazer outra solicitação dentro da mesma conexão persistente e enganar o destinatário (incluindo intermediários) fazendo-o acreditar que esta segunda resposta é uma resposta à segunda solicitação.
3. Solicitar Contrabando
O contrabando de solicitações é uma técnica que explora diferenças no processamento de solicitações por diferentes tipos de servidores para ocultar solicitações aparentemente inofensivas anexadas à solicitação original.
Vamos considerar o seguinte exemplo:
Suponha que uma solicitação POST contenha dois campos de “comprimento do conteúdo” no cabeçalho com dois valores diferentes. Alguns servidores negarão esta solicitação (IIS e Apache), mas outros não. Por exemplo, o SunONE W/S 6.1 usa o campo Content-length primeiro, enquanto o sunONE Proxy 3.6 usa o campo Content-length em segundo lugar.
Supondo que SITE seja o DNS de um SunONE W/S, localizado atrás de um SunONE Proxy, há um arquivo Poison.html localizado no SunONE W/S. Veja como explorar a sugestão de solicitação HTTP com base em inconsistências no processamento entre dois servidores:

[Observe que cada linha termina com um CRLF (“”), exceto a linha 10]
Vamos considerar o que acontece quando uma solicitação é enviada ao W/S através do servidor Proxy. Primeiro, o proxy analisará a solicitação das linhas 1 a 7 (azul) e encontrará dois campos Content-Length. Conforme mencionado acima, ele irá ignorar o primeiro campo e entender que o corpo da solicitação tem 44 bytes. Portanto, ele trata os dados das linhas 8 a 10 como o primeiro corpo da solicitação (das linhas 8 a 10, os dados têm exatamente 44 bytes). O proxy analisará então as linhas 11 a 14 (em vermelho) como a segunda solicitação do cliente.
Agora vamos ver como o W/S interpreta os dados acima, à medida que são encaminhados do proxy. Ao contrário dos proxies, o W/S usará o primeiro campo Content-Length e o interpretará da seguinte forma: a primeira solicitação não tem corpo e a segunda solicitação começa na linha 8 (observe que o W/S analisará a partir da linha 11 como o valor do campo Bla).
A seguir, vamos ver como a resposta é retornada ao cliente. A solicitação que o W/S entende é “POST /foobar.html” (da linha 1) e “GET /poison.html” (da linha 8), portanto enviará ao cliente 2 respostas com o conteúdo da página foobar. html e veneno.html. O proxy entende que essas 2 respostas correspondem a 2 solicitações: "POST /foobar.html" (da linha 1) e "GET /page_to_poison.html" (linha 11). O proxy armazenará em cache o conteúdo da página Poison.html correspondente à URL “page_to_poison.html” (envenenamento de cache). A partir daí, quando o cliente solicitar "page_to_poison.html" ele receberá o conteúdo da página Poison.html.
4. Ataque baseado no caminho do arquivo
Os servidores Web frequentemente usam seu sistema de arquivos local para gerenciar o mapeamento de nomes de arquivos em URIs para recursos reais no servidor. A maioria dos sistemas de arquivos não foi projetada para proteger contra caminhos de arquivos maliciosos. Portanto, o servidor precisa evitar o acesso a arquivos importantes do sistema.
Por exemplo, UNIX, Microsoft Windows e vários outros sistemas operacionais usam “..” como elemento de caminho para representar um diretório um nível acima do arquivo/diretório atual. Sem o devido controle e autorização de entrada, arquivos/pastas confidenciais do sistema podem ser acessados inserindo caminhos que apontam para esses arquivos/pastas.
5. Tipos de ataques: injeção de comando, injeção de código, injeção de consulta
[Os servidores Web costumam usar parâmetros no URI como entrada para executar comandos do sistema e consultas de banco de dados. No entanto, os dados recebidos na solicitação nem sempre são confiáveis. Um invasor pode criar e modificar componentes na solicitação (como métodos, campos no cabeçalho, corpo...), executar comandos do sistema, consultar o banco de dados...
Por exemplo, SQL Injection é um ataque comum em que o servidor web recebe parâmetros no URI que fazem parte da consulta SQL. Portanto, um invasor pode enganar o servidor web para executar consultas SQL ilegais, a fim de roubar ou sabotar o banco de dados.
Em geral, os dados enviados pelos usuários não devem ser utilizados diretamente para realizar operações no servidor. Esses dados precisam passar por filtros, que definem o que é válido e o que é inválido, eliminando assim dados indesejados.
6. Revelação de informações pessoais
Os clientes geralmente contêm muitas informações pessoais, incluindo informações fornecidas pelo usuário para interagir com o servidor (como nome de usuário, senha, localização, endereço de e-mail, etc.) e informações sobre atividades de navegação na web do usuário (histórico, favoritos, etc.). Ao implementar, deve-se prestar atenção à prevenção de pontos que possam revelar essas informações privadas.
7. Revelando informações confidenciais no URI
Os URIs, por definição, devem ser compartilhados com todos os usuários e não têm garantia de segurança. Os URIs são frequentemente exibidos no código-fonte do site e armazenados em marcadores sem mecanismos de proteção. Portanto, não será seguro se o URI contiver informações confidenciais, informações pessoais, etc.
Evite usar o método GET para enviar informações pessoais ao servidor, pois elas serão exibidas no URI. Use o método POST.
8. Revelando informações de software usadas
Os campos User-Agent, Via, Server no cabeçalho geralmente fornecem informações sobre o software usado pelo remetente. Em teoria, isso permite que os invasores explorem mais facilmente vulnerabilidades conhecidas nesses softwares.