O ataque HTTP Request Smuggling explora uma análise incompleta dos dados apresentados feito por um sistema intermediário HTTP trabalhando como um proxy. HTTP Request Smuggling consiste no envio de uma solicitação HTTP especialmente formatada que será analisada de forma diferente pelo sistema de proxy e pelo sistema final, então o atacante poderia roubar uma solicitação para um sistema sem o outro estar ciente disso. Este ataque faz com que seja possível explorar outros ataques, como cache poisoning, session hijacking, Cross-site Scripting (XSS) e, sobretudo, a capacidade de burlar a proteção de firewall de aplicações web.
Para explorar o HTTP Request Smuggling, algumas condições específicas devem existir, tais como a presença do sistema de proxy específico e versão, como SunOne Proxy 3.6 (SP4) ou beta FW-1/FP4-R55W ou uma vulnerabilidade de XSS no servidor web.
Basicamente o ataque consiste em enviar uma solicitação HTTP que encapsula uma segunda solicitação HTTP no mesmo cabeçalho, como mostrado abaixo:
GET /some_page.jsp?param1=value1¶m2=
Content-Type: application/x-www-form-
Content-Length: 0
Foobar: GET /mypage.jsp HTTP/1.0
Cookie: my_id=1234567
Authorization: Basic ugwerwguwygruwy
Neste caso, o primeiro cabeçalho HTTP é analisado pelo sistema de proxy, e o segundo pelo sistema final, permitindo ao invasor burlar as regras de acesso do proxy.
Exemplo: Request Credential Hijacking
Outra area de interesse é a habilidade do atacante forçar a execução de um script (/some_page.jsp) com as credenciais de um cliente. Esse ataque é similar aos efeitos do ataque de Cross-site Request Forgery, mas este é mais eficiente, pois o atacante não é obrigado a interagir com o cliente (vítima). O ataque ocorre como abaixo:
POST /some_script.jsp HTTP/1.0
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
Content-Length: 142
this=thatGET /some_page.jsp?param1=value1¶m2=value2 HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Foobar:
Quando o cliente envia uma requisição, como:
GET /mypage.jsp HTTP/1.0
Cookie: my_id=1234567
Authorization: Basic ugwerwguwygruwy
Tomcat irá colocar esta requisição na fila de incompletes, e juntos, terão:
GET /some_page.jsp?param1=value1¶m2=value2 HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Foobar: GET /mypage.jsp HTTP/1.0
Cookie: my_id=1234567
Authorization: Basic ugwerwguwygruwy
Agora com uma requisição completa, ele irá chamar o script /some_page.jsp e retornar seus resultados ao cliente. Se este script é um pedido de alteração de senha, ou uma transferência de dinheiro para a conta do atacante, então isso pode incorrer em danos potencialmente graves para o cliente.
Diretor de Operações da In2Sec (Itelligence to Security), é formado em Análise de Sistemas com MBA em Gestão de Riscos, atuou em diversas empresas nacionais e multinacionais, no Brasil e exterior. Especialista em Gestão de Riscos e Segurança da Informação, é responsável pelas operações das Américas da Certificadora TrustSign e das Consultorias de Segurança e-Horus e A.