Introdução

HTTP Request Smuggling é uma técnica de interferir a maneira que o site processa sequência de requests HTTP que são recebidos por um ou mais usuários. Vulnerabilidades do tipo Request Smuggling são frequentemente críticas por natureza, e permite que o atacante passe por controles de segurança, ganhar acesso não autorizado a informações sensíveis e comprometer diretamente outros usuários da aplicação.

O que acontece em um ataque HTTP Request Smuggling?

Atualmente, as aplicações web frequentemente usam cadeias de HTTP servers entre usuários e a lógica da aplicação. Usuários envia requests para um servidor frontend (as vezes chamado de balancer ou proxy reverso) e esse server redireciona o request para um ou mais servidores backend. Esse tipo de arquitetura é cada vez mais comum, e em alguns casos inevitável, em aplicações modernas de nuvem.

Quando o servidor frontend redireciona o request HTTP para o servidor do backend, ele tipicamente envia diversos requests para o mesma rede de conexão backend, porque isso muito mais eficiente e performático. Esse protocolo é muito simples: HTTP requests são enviados um atrás do outro, e quando são recebidos pelo servidor são interpretados para definir onde um request começa e onde o próximo request termina:

500|center

Nessa situação, é crucial que o sistema do frontend e backend concordam sobre os limites entre os requests. Ao contrário, o atacante pode ser capaz de enviar requests ambíguos que serão interpretados diferentemente pelos servidores do backend e frontend:

500 | center

Nesse exemplo, o atacante faz com que o request no servidor frontend seja interpretado como o começo do próximo request no servidor backend. Isso pode ter um efeito devastador no sistema.

Como realizar um ataque HTTP Smuggling Request?

Para realizar um ataque de HTTP Smuggling Request, é necessário com que tenha um entendimento sobre os Headers dos requests. Existem alguns headers necessários e algumas observações importantes:

Content-Type: application/x-www-form-urlencoded Content-Length: 6 Transfer-Encoding: chunked