Parameter Pollution | JSON Injection
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HTTP Parameter Pollution (HPP) Overview
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 para o usuário, mas pode alterar significativamente a funcionalidade da aplicação no lado do servidor, com impactos observáveis no cliente.
Example of HTTP Parameter Pollution (HPP)
A URL de transação de um banco:
- Original URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Ao inserir um parâmetro from adicional:
- Manipulated URL:
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 resets de senha, configurações de 2FA ou solicitações de API key.
Technology-Specific Parameter Parsing
- A forma como os parâmetros são parseados 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.
PHP and HPP Exploitation
OTP Manipulation Case:
- Context: Um mecanismo de login que exige One-Time Password (OTP) foi explorado.
- Method: Interceptando a requisição de OTP usando ferramentas como Burp Suite, atacantes duplicaram o parâmetro
emailna requisição HTTP. - Outcome: O OTP, destinado ao email inicial, foi enviado ao 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 destaca 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 entrega.
API Key Manipulation Case:
- Scenario: Uma aplicação permite que usuários atualizem sua API key através de uma página de configurações de perfil.
- Attack Vector: Um atacante descobre que, ao anexar um parâmetro
api_keyadicional ao POST request, ele pode manipular o resultado da função de atualização da API key. - Technique: 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. - Result: O atacante obtém 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 tratamento seguro de parâmetros, especialmente em funcionalidades críticas como gerenciamento de API keys.
Parameter Parsing: 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 do parâmetro encontrado, como
a=1em uma query stringa=1&a=2, priorizando a instância inicial sobre duplicatas subsequentes. - PHP (on Apache HTTP Server): Em contraste, prioriza o último valor do parâmetro, optando por
a=2no exemplo dado. Esse comportamento pode facilitar inadvertidamente explorações HPP ao honrar o parâmetro manipulado pelo atacante em vez do 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 do lado do servidor, duplique cada parâmetro em query strings ou bodies e observe se a aplicação concatena valores, usa o primeiro/último, ou gera erro.
- Para HPP do lado do cliente, injete um
&codificado em URL em um valor de parâmetro refletido (ex.:%26HPP_TEST) e procure por ocorrências decodificadas como&HPP_TESTou&HPP_TESTdentro de links gerados ou actions de formulários.
Server-Side Parameter Pollution (SSPP) in Internal APIs
Algumas aplicações incorporam input do usuário em requisições server-side para APIs internas. Se esse input não for corretamente encoded, você pode injetar ou sobrescrever parâmetros na requisição interna. Teste qualquer input do usuário, incluindo query parameters, campos de formulário, headers e parâmetros de caminho da URL.
Probes comuns:
- Adicione um novo parâmetro com
%26(URL-encoded&). - Trunque a query downstream com
%23(URL-encoded#). - Sobrescreva um parâmetro existente duplicando-o.
Example:
GET /userSearch?name=peter%26name=carlos&back=/home
Potencialmente resulta em uma requisição do lado do servidor como:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution por tecnologia
Os resultados foram retirados de https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 E 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 GET Method.
- Prefere 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 dividir parâmetros.
- Não reconhece name[].
- Prefere o primeiro parâmetro.
Spring MVC 6.0.23 E 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[].
- Prefere name se name e name[] existirem.
- Concatena parâmetros, por ex. first,last.
- POST RequestMapping & PostMapping reconhecem query parameter com Content-Type.
NodeJS 20.17.0 E Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Reconhece name[].
- Concatena parâmetros, por ex. 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[].
- Prefere 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[].
- Prefere 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[].
- Prefere 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[].
- Prefere o último parâmetro.
JSON Injection
Chaves duplicadas
obj = {"test": "user", "test": "admin"}
O front-end pode considerar 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 os interpretará e usará essas chaves, isso pode ser útil para bypass certas restrições:
{"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 achar que test == 1 e o backend achará que test == 2.
Isto 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 (por exemplo, GoLang’s GoJay library) produzirá:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (por exemplo, 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" }
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 e Integer
O número
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
pode ser decodificado em múltiplas representações, incluindo:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
O que pode criar inconsistências
References
-
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 Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


