Você já pensou em enviar um mesmo parâmetro HTTP várias vezes com valores diferentes na mesma requisição? O que aconteceria se você enviasse algo como: “id=123554&id=6545604”? A resposta para essa pergunta é que depende do servidor backend. Se você pesquisar na internet, você verá que o parâmetro de consulta do Yahoo retorna o último valor, enquanto o Google retorna ambos os valores concatenados. Alguns servidores retornam o primeiro valor, outros retornam o último valor e outros retornam tudo.
No entanto, se o nosso código de servidor fosse escrito em JSP e estivesse sendo executado em um servidor Tomcat, ele retornaria o primeiro valor. Se fosse PHP no Apache, ele retornaria o último valor. E se fosse asp.net em iOS, ele retornaria todos eles concatenados. Por que eles têm implementações diferentes? Simplesmente porque não há especificação ou padrão para aceitar parâmetros HTTP. As pessoas fazem suas próprias escolhas e tudo acaba se tornando uma bagunça.
Agora que entendemos esse comportamento estranho, podemos abusar dele de uma forma que enfraqueça a segurança. Podemos usar esse comportamento para o que é chamado de “poluição de parâmetros HTTP”. Para explicar melhor, vamos dar um exemplo de como isso pode ser explorado.
Imagine que temos um site chamado “algumacoisa.com”. Neste site, você pode fazer coisas normais, como postar em um feed de notícias ou compartilhar suas postagens em outras plataformas, como Facebook e Twitter. Quando você tenta compartilhar uma postagem, você vê esta URL:
https://www.algumacoisa.com/sharer/sharer.php?u=http%3A%2F%2Fsomeurl.com&t=Some%20Title
Existem dois parâmetros: o primeiro é o título da postagem e o segundo é a URL da postagem. Se você observar a URL de compartilhamento do Algumacoisa.com com mais atenção, verá um “&” que não está realmente codificado. Isso significa que você pode adicionar seus próprios parâmetros HTTP no título da postagem e isso será refletido na URL de compartilhamento do Facebook sem codificação.
No nosso exemplo, vamos adicionar um novo parâmetro ao título da postagem e defini-lo como “algumacoisa.com”. Se definirmos o título como “my payload” e clicarmos em compartilhar, compartilharemos o site do atacante em vez do link para a postagem original.
Como isso funcionou? Quando você tenta compartilhar um link no algumacoisa.com, o serviço do algumacoisa.com sharer requer dois parâmetros: o título e a URL. Como o título não está realmente codificado, podemos adicionar um “&” no final e ter nossos próprios parâmetros HTTP anexados. Se você observar a URL de compartilhamento do algumacoisa.com, verá o nome do arquivo que é responsável por compartilhar tudo no algumacoisa.com. É um arquivo PHP. Como PHP considera a última ocorrência, no nosso caso, o parâmetro original será ignorado e nosso parâmetro recém-adicionado será considerado porque é a última ocorrência. Agora, quando você tenta compartilhar o link no algumacoisa.com, ele aceitará o site do atacante em vez da URL
Mas não se preocupe, existem maneiras de evitar esse tipo de vulnerabilidade. Algumas delas são:
- Validação de entrada: sempre valide os dados de entrada para garantir que não há caracteres maliciosos ou códigos inseridos.
- Codificação correta: certifique-se de que todas as informações que você envia estão devidamente codificadas para evitar que caracteres especiais sejam interpretados como parâmetros.
- Limitação de parâmetros: restrinja os parâmetros que são aceitos em uma solicitação HTTP. Isso ajuda a evitar que parâmetros extras sejam inseridos em uma solicitação.
- Configuração de servidor segura: configure o seu servidor web de maneira segura para evitar que um invasor acesse informações ou recursos não autorizados.
- Monitoramento constante: monitore o tráfego da web em seu servidor para identificar qualquer atividade maliciosa.
A poluição de parâmetros HTTP é uma vulnerabilidade real que pode ser explorada por invasores para comprometer um sistema. No entanto, existem medidas que podem ser tomadas para evitar essa vulnerabilidade, incluindo a validação de entrada, a codificação correta, a limitação de parâmetros, a configuração segura do servidor e o monitoramento constante. Ao implementar essas medidas, você pode ajudar a proteger seu sistema contra essa e outras vulnerabilidades.