diff --git a/SUMMARY.md b/SUMMARY.md index 60279767a..0103b2fa9 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -604,7 +604,7 @@ * [OAuth to Account takeover](pentesting-web/oauth-to-account-takeover.md) * [Open Redirect](pentesting-web/open-redirect.md) * [ORM Injection](pentesting-web/orm-injection.md) -* [Parameter Pollution](pentesting-web/parameter-pollution.md) +* [Parameter Pollution | JSON Injection](pentesting-web/parameter-pollution.md) * [Phone Number Injections](pentesting-web/phone-number-injections.md) * [PostMessage Vulnerabilities](pentesting-web/postmessage-vulnerabilities/README.md) * [Blocking main page to steal postmessage](pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md) diff --git a/pentesting-web/parameter-pollution.md b/pentesting-web/parameter-pollution.md index ecb9feed5..d22812247 100644 --- a/pentesting-web/parameter-pollution.md +++ b/pentesting-web/parameter-pollution.md @@ -1,6 +1,6 @@ -# Poluição de Parâmetros +# Parameter Pollution | JSON Injection -## Poluição de Parâmetros +## Parameter Pollution {% hint style="success" %} Aprenda e pratique Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ @@ -12,7 +12,7 @@ Aprenda e pratique Hacking GCP: {% endhint %} @@ -65,8 +65,8 @@ Esse exemplo reforça ainda mais a necessidade de um manuseio seguro de parâmet 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 sobre duplicatas subsequentes. -* **PHP (no Apache HTTP Server):** Contrariamente, 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. +* **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 @@ -94,8 +94,8 @@ Os resultados foram retirados de [https://medium.com/@0xAwali/http-parameter-pol

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. +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. @@ -103,58 +103,143 @@ Os resultados foram retirados de [https://medium.com/@0xAwali/http-parameter-pol

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

-1. Reconhece name\[]. +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\[]. +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\[]. +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\[]. +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\[]. +1. NÃO reconhece name[]. 2. Preferir o último parâmetro. +## Injeção JSON + +### Chaves duplicadas +```ini +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**: +```json +{"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: +```json +{"role": "administrator\[raw \x0d byte]"} +{"role":"administrator\ud800"} +{"role": "administrator""} +{"role": "admini\strator"} +``` +### **Usando Truncamento de Comentários** + +{% code overflow="wrap" %} +```ini +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: +```ini +obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/} +``` +A biblioteca GSON do Java: +```json +{"description":"Comment support","test":1,"extra":"a"} +``` +A biblioteca simdjson do Ruby: +```json +{"description":"Comment support","test":2,"extra":"a","extra2":"b"} +``` +### **Precedência Inconsistente: Desserialização vs. Serialização** +```ini +obj = {"test": 1, "test": 2} + +obj["test"] // 1 +obj.toString() // {"test": 2} +``` +### Float e Inteiro + +O número +```undefined +999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 +``` +pode ser decodificado em múltiplas representações, incluindo: +```undefined +999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 +9.999999999999999e95 +1E+96 +0 +9223372036854775807 +``` +Which might create inconsistências + ## Referências * [https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654](https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654) * [https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution](https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution) * [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) +* [https://bishopfox.com/blog/json-interoperability-vulnerabilities](https://bishopfox.com/blog/json-interoperability-vulnerabilities)
{% embed url="https://websec.nl/" %} {% hint style="success" %} -Aprenda e pratique Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Aprenda e pratique Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks -* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)! -* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud). +* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! +* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}