Parameter Pollution | JSON Injection
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.
HTTP Parameter Pollution (HPP) — Visão geral
HTTP Parameter Pollution (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 ao usuário, mas pode alterar significativamente a funcionalidade da aplicação no lado do servidor, com impactos observáveis no lado do cliente.
Exemplo de HTTP Parameter Pollution (HPP)
A URL de uma transação bancária:
- 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 cobrada incorretamente de accountC em vez de accountA, demonstrando o potencial do HPP para manipular transações ou outras funcionalidades como redefinições de senha, configurações de 2FA ou solicitações de API key.
Interpretação de Parâmetros Específica por Tecnologia
- A forma como os parâmetros são interpretados e priorizados depende da tecnologia web subjacente, afetando como o HPP pode ser explorado.
- Ferramentas como Wappalyzer ajudam a identificar essas tecnologias e seus comportamentos de parsing.
Exploração em PHP e HPP
OTP Manipulation Case:
- Contexto: Um mecanismo de login que exige um One-Time Password (OTP) foi explorado.
- Método: Ao interceptar a requisição de OTP usando ferramentas como Burp Suite, atacantes duplicaram o parâmetro
emailna requisição HTTP. - Resultado: O OTP, destinado ao email inicial, foi enviado em vez disso para o segundo endereço de email especificado na requisição manipulada. Essa falha permitiu acesso não autorizado ao contornar a medida de segurança pretendida.
Esse cenário evidencia uma falha crítica no backend da aplicação, que processou o primeiro parâmetro email para geração do OTP, mas usou o último para a entrega.
API Key Manipulation Case:
- Cenário: Uma aplicação permite que usuários atualizem sua API key através de uma página de configurações de perfil.
- Vetor de ataque: Um atacante descobre que ao acrescentar um parâmetro
api_keyadicional na requisição POST, ele pode manipular o resultado da função de atualização da API key. - Técnica: Utilizando uma ferramenta como Burp Suite, o atacante cria uma requisição que inclui dois parâmetros
api_key: um legítimo e um malicioso. O servidor, processando apenas a última ocorrência, atualiza a API key para o valor fornecido pelo atacante. - Resultado: O atacante assume controle sobre a funcionalidade de API da vítima, potencialmente acessando ou modificando dados privados sem autorização.
Esse exemplo reforça a necessidade de um tratamento seguro de parâmetros, especialmente em funcionalidades críticas como gerenciamento de API key.
Interpretação de Parâmetros: Flask vs. PHP
A forma como 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=1em uma query stringa=1&a=2, priorizando a instância inicial em vez das duplicatas subsequentes. - PHP (on Apache HTTP Server): Em contraste, prioriza o último valor de parâmetro, escolhendo
a=2no exemplo dado. Esse comportamento pode facilitar exploits de HPP ao favorecer o parâmetro manipulado pelo atacante sobre o original.
HPP Testing Notes (OWASP WSTG)
- Os padrões HTTP não definem como interpretar múltiplos parâmetros com o mesmo nome, então o comportamento varia entre stacks e componentes.
- Ao testar HPP no lado do servidor, duplique cada parâmetro em query strings ou corpos e observe se a aplicação concatena valores, usa o primeiro/último ou devolve erro.
- Para HPP no lado do cliente, injete um
&codificado em URL dentro de um valor de parâmetro refletido (ex.:%26HPP_TEST) e procure por ocorrências decodificadas como&HPP_TESTou&HPP_TESTdentro de links gerados ou ações de formulários.
Server-Side Parameter Pollution (SSPP) em APIs internas
Algumas aplicações embutem entrada do usuário em requisições do lado do servidor para APIs internas. Se essa entrada não for devidamente codificada, você pode injetar ou sobrescrever parâmetros na requisição interna. Teste qualquer entrada do usuário, incluindo query parameters, campos de formulários, headers e parâmetros de caminho da URL.
Testes comuns:
- Adicionar um novo parâmetro com
%26(URL-encoded&). - Truncar a query downstream com
%23(URL-encoded#). - Sobrescrever um parâmetro existente duplicando-o.
Exemplo:
GET /userSearch?name=peter%26name=carlos&back=/home
Pode resultar em uma requisição do lado do servidor como:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution by technology
There results were taken from https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 AND Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ignora qualquer coisa após %00 no nome do parâmetro.
- Trata name[] como array.
- _GET não significa o método GET.
- Prefira o último parâmetro.
Ruby 3.3.5 and WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Usa os delimitadores & e ; para separar parâmetros.
- Não reconhece name[].
- Prefira o primeiro parâmetro.
Spring MVC 6.0.23 AND Apache Tomcat 10.1.30
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
- POST RequestMapping & PostMapping reconhecem name[].
- Prefira name se name e name[] existirem.
- Concatena parâmetros, por exemplo first,last.
- POST RequestMapping & PostMapping reconhecem query parameter com Content-Type.
NodeJS 20.17.0 AND Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Reconhece name[].
- Concatena parâmetros, por exemplo first,last.
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- Não reconhece name[].
- Prefira o primeiro parâmetro.
Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- Não reconhece name[].
- Prefira o primeiro parâmetro.
Python 3.12.6 AND Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- Não reconhece name[].
- Prefira o último parâmetro.
Python 3.12.6 AND Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- Não reconhece name[].
- Prefira o último parâmetro.
JSON Injection
Chaves duplicadas
obj = {"test": "user", "test": "admin"}
O front-end pode aceitar a primeira ocorrência enquanto o backend usa a segunda ocorrência da chave.
Key Collision: Character Truncation and Comments
Certos caracteres não serão interpretados corretamente pelo frontend, mas o backend irá interpretá-los e usar essas chaves, isso pode ser útil para bypass certain restrictions:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Observe como, nesses casos, o front end pode pensar que test == 1 e o backend vai pensar que test == 2.
Isso também pode ser usado para contornar restrições de valor como:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Usando Comment Truncation
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Aqui usaremos o serializer de cada parser para ver sua respectiva saída.
Serializer 1 (e.g., GoLang’s GoJay library) produzirá:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (e.g., Java’s JSON-iterator library) produzirá:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Alternativamente, o uso direto de comentários também pode ser eficaz:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Biblioteca GSON do Java:
{ "description": "Comment support", "test": 1, "extra": "a" }
A biblioteca simdjson do Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Precedência Inconsistente: Deserialization vs. Serialization
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float and Integer
O número
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
pode ser decodificado em várias representações, incluindo:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
O que pode criar inconsistências
Referências
-
https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654
-
https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution
-
https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
-
https://bishopfox.com/blog/json-interoperability-vulnerabilities
-
https://portswigger.net/web-security/api-testing/server-side-parameter-pollution
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.


