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

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 email na 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_key adicional 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=1 em uma query string a=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=2 no 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_TEST ou &HPP_TEST dentro 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

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

  1. Ignora qualquer coisa após %00 no nome do parâmetro.
  2. Trata name[] como array.
  3. _GET não significa o método GET.
  4. Prefira o último parâmetro.

Ruby 3.3.5 and WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

  1. Usa os delimitadores & e ; para separar parâmetros.
  2. Não reconhece name[].
  3. Prefira o primeiro parâmetro.

Spring MVC 6.0.23 AND Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

  1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
  2. POST RequestMapping & PostMapping reconhecem name[].
  3. Prefira name se name e name[] existirem.
  4. Concatena parâmetros, por exemplo first,last.
  5. POST RequestMapping & PostMapping reconhecem query parameter com Content-Type.

NodeJS 20.17.0 AND Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

  1. Reconhece name[].
  2. Concatena parâmetros, por exemplo first,last.

GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

  1. Não reconhece name[].
  2. Prefira o primeiro parâmetro.

Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

  1. Não reconhece name[].
  2. Prefira o primeiro parâmetro.

Python 3.12.6 AND Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

  1. Não reconhece name[].
  2. Prefira o último parâmetro.

Python 3.12.6 AND Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

  1. Não reconhece name[].
  2. Prefira o último parâmetro.

JSON Injection

JSON, XML and YAML Hacking

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 = 2
  • extra = ""

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

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