Parameter Pollution | JSON Injection
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
A Poluição de Parâmetros HTTP (HPP) é uma técnica onde atacantes manipulam parâmetros HTTP para alterar o comportamento de uma aplicação web de maneiras não intencionais. Essa manipulação é feita adicionando, modificando ou duplicando parâmetros HTTP. O efeito dessas manipulações não é diretamente visível para o usuário, mas pode alterar significativamente a funcionalidade da aplicação no lado do servidor, com impactos observáveis no lado do cliente.
Uma URL de transação de um aplicativo bancário:
URL Original: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Ao inserir um parâmetro from
adicional:
URL Manipulada: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
A transação pode ser incorretamente cobrada para accountC
em vez de accountA
, demonstrando o potencial da HPP para manipular transações ou outras funcionalidades, como redefinições de senha, configurações de 2FA ou solicitações de chave de API.
A forma como os parâmetros são analisados e priorizados depende da tecnologia web subjacente, afetando como a HPP pode ser explorada.
Ferramentas como Wappalyzer ajudam a identificar essas tecnologias e seus comportamentos de análise.
Caso de Manipulação de OTP:
Contexto: Um mecanismo de login que requer uma Senha de Uso Único (OTP) foi explorado.
Método: Ao interceptar a solicitação de OTP usando ferramentas como Burp Suite, os atacantes duplicaram o parâmetro email
na solicitação HTTP.
Resultado: O OTP, destinado ao email inicial, foi enviado para o segundo endereço de email especificado na solicitação manipulada. Essa falha permitiu acesso não autorizado ao contornar a medida de segurança pretendida.
Esse cenário destaca uma falha crítica no backend da aplicação, que processou o primeiro parâmetro email
para a geração de OTP, mas usou o último para entrega.
Caso de Manipulação de Chave de API:
Cenário: Um aplicativo permite que os usuários atualizem sua chave de API através de uma página de configurações de perfil.
Vetor de Ataque: Um atacante descobre que, ao anexar um parâmetro api_key
adicional à solicitação POST, pode manipular o resultado da função de atualização da chave de API.
Técnica: Utilizando uma ferramenta como Burp Suite, o atacante cria uma solicitação que inclui dois parâmetros api_key
: um legítimo e um malicioso. O servidor, processando apenas a última ocorrência, atualiza a chave de API para o valor fornecido pelo atacante.
Resultado: O atacante ganha controle sobre a funcionalidade da API da vítima, potencialmente acessando ou modificando dados privados de forma não autorizada.
Esse exemplo reforça ainda mais a necessidade de um manuseio seguro de parâmetros, especialmente em recursos tão críticos quanto a gestão de chaves de API.
A forma como as tecnologias web lidam com parâmetros HTTP duplicados varia, afetando sua suscetibilidade a ataques HPP:
Flask: Adota o primeiro valor de parâmetro encontrado, como a=1
em uma string de consulta a=1&a=2
, priorizando a instância inicial em relação a duplicatas subsequentes.
PHP (no Apache HTTP Server): Por outro lado, prioriza o último valor de parâmetro, optando por a=2
no exemplo dado. Esse comportamento pode inadvertidamente facilitar explorações de HPP ao honrar o parâmetro manipulado do atacante em vez do original.
Os resultados foram retirados de https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
Ignorar qualquer coisa após %00 no nome do parâmetro.
Tratar name[] como array.
_GET não significa Método GET.
Preferir o último parâmetro.
Usa os delimitadores & e ; para dividir parâmetros.
Não reconhece name[].
Preferir o primeiro parâmetro.
POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
POST RequestMapping & PostMapping reconhecem name[].
Preferir name se name E name[] existirem.
Concatenar parâmetros, por exemplo, first,last.
POST RequestMapping & PostMapping reconhecem parâmetros de consulta com Content-Type.
Reconhece name[].
Concatenar parâmetros, por exemplo, first,last.
NÃO reconhece name[].
Preferir o primeiro parâmetro.
NÃO reconhece name[].
Preferir o primeiro parâmetro.
NÃO reconhece name[].
Preferir o último parâmetro.
NÃO reconhece name[].
Preferir o último parâmetro.
A interface pode acreditar na primeira ocorrência enquanto o backend usa a segunda ocorrência da chave.
Certos caracteres não serão interpretados corretamente pela interface, mas o backend os interpretará e usará essas chaves, isso pode ser útil para contornar certas restrições:
Note como nesses casos o front end pode pensar que test == 1
e o backend pensará que test == 2
.
Isso também pode ser usado para contornar restrições de valor como:
Aqui usaremos o serializador de cada parser para visualizar sua respectiva saída.
Serializador 1 (por exemplo, a biblioteca GoJay do GoLang) produzirá:
description = "Duplicado com comentários"
test = 2
extra = ""
Serializador 2 (por exemplo, a biblioteca JSON-iterator do Java) produzirá:
description = "Duplicado com comentários"
extra = "/*"
extra2 = "*/"
test = 1
Alternativamente, o uso direto de comentários também pode ser eficaz:
A biblioteca GSON do Java:
A biblioteca simdjson do Ruby:
O número
pode ser decodificado em múltiplas representações, incluindo:
Which might create inconsistências
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)