Parameter Pollution | JSON Injection
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord, al grupo de telegram, sigue @hacktricks_live en X/Twitter, o revisa la página de LinkedIn y el canal de YouTube.
- Comparte hacking tricks enviando PRs a los repositorios de github HackTricks y HackTricks Cloud.
HTTP Parameter Pollution (HPP) Overview
HTTP Parameter Pollution (HPP) es una técnica en la que atacantes manipulan parámetros HTTP para cambiar el comportamiento de una aplicación web de maneras no intencionadas. Esta manipulación se realiza añadiendo, modificando o duplicando parámetros HTTP. El efecto de estas manipulaciones no es directamente visible para el usuario pero puede alterar significativamente la funcionalidad de la aplicación en el lado del servidor, con impactos observables en el cliente.
Example of HTTP Parameter Pollution (HPP)
Una URL de transacción de una aplicación bancaria:
- Original URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Al insertar un from adicional:
- Manipulated URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
La transacción puede ser cargada incorrectamente a accountC en lugar de accountA, demostrando el potencial de HPP para manipular transacciones u otras funcionalidades como restablecimientos de contraseña, configuraciones de 2FA o solicitudes de API key.
Technology-Specific Parameter Parsing
- La forma en que se parsean y priorizan los parámetros depende de la tecnología web subyacente, lo que afecta cómo se puede explotar HPP.
- Herramientas como Wappalyzer ayudan a identificar estas tecnologías y sus comportamientos de parseo.
PHP and HPP Exploitation
OTP - Caso de manipulación:
- Contexto: Se explotó un mecanismo de login que requería un One-Time Password (OTP).
- Método: Interceptando la solicitud de OTP con herramientas como Burp Suite, los atacantes duplicaron el parámetro
emailen la petición HTTP. - Resultado: El OTP, destinado al email inicial, fue enviado en su lugar a la segunda dirección de email especificada en la petición manipulada. Esta falla permitió acceso no autorizado al eludir la medida de seguridad prevista.
Este escenario destaca una falla crítica en el backend de la aplicación, que procesó el primer parámetro email para la generación del OTP pero usó el último para la entrega.
API Key - Caso de manipulación:
- Escenario: Una aplicación permite a los usuarios actualizar su API key a través de la página de ajustes de perfil.
- Vector de ataque: Un atacante descubre que añadiendo un parámetro
api_keyadicional al POST puede manipular el resultado de la función de actualización de la API key. - Técnica: Utilizando una herramienta como Burp Suite, el atacante crea una petición que incluye dos parámetros
api_key: uno legítimo y otro malicioso. El servidor, procesando solo la última ocurrencia, actualiza la API key con el valor proporcionado por el atacante. - Resultado: El atacante obtiene control sobre la funcionalidad de la API de la víctima, potencialmente accediendo o modificando datos privados sin autorización.
Este ejemplo subraya la necesidad de un manejo seguro de parámetros, especialmente en funcionalidades tan críticas como la gestión de API keys.
Parameter Parsing: Flask vs. PHP
La forma en que las tecnologías web manejan parámetros HTTP duplicados varía, afectando su susceptibilidad a ataques HPP:
- Flask: Adopta el primer valor de parámetro encontrado, por ejemplo
a=1en una query stringa=1&a=2, priorizando la instancia inicial sobre las duplicadas. - PHP (on Apache HTTP Server): En contraste, prioriza el último valor de parámetro, optando por
a=2en el ejemplo dado. Este comportamiento puede facilitar inadvertidamente explotaciones HPP al respetar el parámetro manipulado por el atacante sobre el original.
HPP Testing Notes (OWASP WSTG)
- Los estándares HTTP no definen cómo interpretar múltiples parámetros con el mismo nombre, por lo que el comportamiento varía entre stacks y componentes.
- Al probar HPP en el lado del servidor, duplica cada parámetro en query strings o bodies y observa si la aplicación concatena valores, usa el primero/último, o lanza errores.
- Para HPP en el lado del cliente, inyecta un
&codificado en URL en un valor de parámetro reflejado (por ejemplo,%26HPP_TEST) y busca ocurrencias decodificadas como&HPP_TESTo&HPP_TESTdentro de enlaces generados o acciones de formularios.
Server-Side Parameter Pollution (SSPP) in Internal APIs
Algunas aplicaciones incrustan input de usuario en solicitudes del lado del servidor a APIs internas. Si ese input no está correctamente codificado, puedes inyectar o sobrescribir parámetros en la solicitud interna. Prueba cualquier input del usuario, incluyendo query parameters, campos de formularios, headers y parámetros de ruta en la URL.
Probes comunes:
- Añadir un nuevo parámetro con
%26(URL-encoded&). - Truncar la query downstream con
%23(URL-encoded#). - Sobrescribir un parámetro existente duplicándolo.
Example:
GET /userSearch?name=peter%26name=carlos&back=/home
Podría resultar en una solicitud del lado del servidor como:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution por tecnología
Los resultados fueron tomados de https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 Y Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ignora cualquier cosa después de %00 en el nombre del parámetro .
- Interpreta name[] como array .
- _GET no significa el método GET .
- Prefiere el ú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 los delimitadores & y ; para dividir parámetros .
- No reconoce name[] .
- Prefiere el primer parámetro .
Spring MVC 6.0.23 Y 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 reconocen name[] .
- Prefiere name si name y name[] existen .
- Concatena parámetros p. ej. first,last .
- POST RequestMapping & PostMapping reconocen query parameter con Content-Type .
NodeJS 20.17.0 Y Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Reconoce name[] .
- Concatena parámetros p. ej. first,last .
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- No reconoce name[] .
- Prefiere el primer parámetro .
Python 3.12.6 Y Werkzeug 3.0.4 Y Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- No reconoce name[] .
- Prefiere el primer parámetro .
Python 3.12.6 Y Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- No reconoce name[] .
- Prefiere el último parámetro .
Python 3.12.6 Y Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- No reconoce name[] .
- Prefiere el último parámetro .
JSON Injection
Claves duplicadas
obj = {"test": "user", "test": "admin"}
El front-end podría considerar la primera ocurrencia mientras que el backend usa la segunda ocurrencia de la clave.
Key Collision: Character Truncation and Comments
Ciertos caracteres no serán interpretados correctamente por el front-end, pero el backend los interpretará y usará esas claves; esto podría ser útil para bypass ciertas restricciones:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Observe cómo en estos casos el front end podría pensar que test == 1 y el backend pensará que test == 2.
Esto también puede usarse para eludir restricciones de valor como:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Uso de Comment Truncation
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Aquí usaremos el serializer de cada parser para ver su salida respectiva.
Serializer 1 (e.g., GoLang’s GoJay library) producirá:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (e.g., Java’s JSON-iterator library) producirá:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Alternativamente, el uso directo de comentarios también puede ser efectivo:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
La librería GSON de Java:
{ "description": "Comment support", "test": 1, "extra": "a" }
La biblioteca simdjson de Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Precedencia inconsistente: Deserialización vs. Serialización
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Flotante y Entero
El número
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
puede decodificarse en múltiples representaciones, incluyendo:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Lo cual podría crear inconsistencias
Referencias
-
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
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord, al grupo de telegram, sigue @hacktricks_live en X/Twitter, o revisa la página de LinkedIn y el canal de YouTube.
- Comparte hacking tricks enviando PRs a los repositorios de github HackTricks y HackTricks Cloud.


