hacktricks/pentesting-web/parameter-pollution.md
2024-12-12 13:56:11 +01:00

13 KiB

Parameter Pollution | JSON Injection

Parameter Pollution

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

{% embed url="https://websec.nl/" %}

Visão Geral da Poluição de Parâmetros HTTP (HPP)

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.

Exemplo de Poluição de Parâmetros HTTP (HPP)

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.

Análise de Parâmetros Específica da Tecnologia

  • 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.

Exploração de HPP em PHP

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.

Análise de Parâmetros: Flask vs. PHP

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.

Poluição de parâmetros 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

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

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

Ruby 3.3.5 e WEBrick 1.8.2

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

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

Spring MVC 6.0.23 E 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. Preferir name se name E name[] existirem.
  4. Concatenar parâmetros, por exemplo, first,last.
  5. POST RequestMapping & PostMapping reconhecem parâmetros de consulta com Content-Type.

NodeJS 20.17.0 E Express 4.21.0

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

  1. Reconhece name[].
  2. Concatenar 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. Preferir o primeiro parâmetro.

Python 3.12.6 E Werkzeug 3.0.4 E Flask 3.0.3

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

  1. NÃO reconhece name[].
  2. Preferir o primeiro parâmetro.

Python 3.12.6 E Django 4.2.15

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

  1. NÃO reconhece name[].
  2. Preferir o último parâmetro.

Python 3.12.6 E Tornado 6.4.1

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

  1. NÃO reconhece name[].
  2. Preferir o último parâmetro.

Injeção JSON

Chaves duplicadas

obj = {"test": "user", "test": "admin"}

A interface pode acreditar na primeira ocorrência enquanto o backend usa a segunda ocorrência da chave.

Colisão de Chaves: Truncamento de Caracteres e Comentários

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:

{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}

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:

{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}

Usando Truncamento de Comentários

{% code overflow="wrap" %}

obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}

{% endcode %}

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:

obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}

A 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: Desserialização vs. Serialização

obj = {"test": 1, "test": 2}

obj["test"] // 1
obj.toString() // {"test": 2}

Float e Inteiro

O número

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

pode ser decodificado em múltiplas representações, incluindo:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Which might create inconsistências

Referências

{% embed url="https://websec.nl/" %}

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}