Parameter Pollution | JSON Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
HTTP Parameter Pollution (HPP) es una técnica donde los 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 lado del cliente.
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 parámetro from
adicional:
Manipulated URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
La transacción puede ser incorrectamente cargada a accountC
en lugar de accountA
, mostrando el potencial de HPP para manipular transacciones u otras funcionalidades como restablecimientos de contraseña, configuraciones de 2FA o solicitudes de claves API.
La forma en que se analizan y priorizan los parámetros depende de la tecnología web subyacente, afectando cómo se puede explotar HPP.
Herramientas como Wappalyzer ayudan a identificar estas tecnologías y sus comportamientos de análisis.
OTP Manipulation Case:
Context: Se explotó un mecanismo de inicio de sesión que requería una Contraseña de Un Solo Uso (OTP).
Method: Al interceptar la solicitud de OTP utilizando herramientas como Burp Suite, los atacantes duplicaron el parámetro email
en la solicitud HTTP.
Outcome: El OTP, destinado al correo electrónico inicial, fue enviado en su lugar a la segunda dirección de correo electrónico especificada en la solicitud manipulada. Este defecto permitió el 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 de OTP, pero utilizó el último para la entrega.
API Key Manipulation Case:
Scenario: Una aplicación permite a los usuarios actualizar su clave API a través de una página de configuración de perfil.
Attack Vector: Un atacante descubre que al añadir un parámetro api_key
adicional a la solicitud POST, puede manipular el resultado de la función de actualización de la clave API.
Technique: Utilizando una herramienta como Burp Suite, el atacante elabora una solicitud que incluye dos parámetros api_key
: uno legítimo y uno malicioso. El servidor, procesando solo la última ocurrencia, actualiza la clave API al valor proporcionado por el atacante.
Result: El atacante obtiene control sobre la funcionalidad API de la víctima, potencialmente accediendo o modificando datos privados sin autorización.
Este ejemplo subraya aún más la necesidad de un manejo seguro de parámetros, especialmente en características tan críticas como la gestión de claves API.
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, como a=1
en una cadena de consulta a=1&a=2
, priorizando la instancia inicial sobre los duplicados posteriores.
PHP (en Apache HTTP Server): Por el contrario, prioriza el último valor de parámetro, optando por a=2
en el ejemplo dado. Este comportamiento puede facilitar inadvertidamente los exploits HPP al honrar el parámetro manipulado por el atacante sobre el original.
There results were taken from https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
Ignorar cualquier cosa después de %00 en el nombre del parámetro.
Manejar name[] como array.
_GET no significa método GET.
Preferir el último parámetro.
Utiliza los delimitadores & y ; para dividir parámetros.
No reconoce name[].
Prefiere el primer parámetro.
POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
POST RequestMapping & PostMapping reconocen name[].
Prefiere name si name Y name[] existen.
Concatenar parámetros e.g. first,last.
POST RequestMapping & PostMapping reconocen parámetros de consulta con Content-Type.
Reconoce name[].
Concatenar parámetros e.g. first,last.
NO reconoce name[].
Prefiere el primer parámetro.
NO reconoce name[].
Prefiere el primer parámetro.
NO reconoce name[].
Prefiere el último parámetro.
NO reconoce name[].
Prefiere el último parámetro.
El front-end podría creer la primera ocurrencia mientras que el backend utiliza la segunda ocurrencia de la clave.
Ciertos caracteres no serán interpretados correctamente por el frontend, pero el backend los interpretará y utilizará esas claves, esto podría ser útil para eludir ciertas restricciones:
Nota cómo en estos casos el front end podría pensar que test == 1
y el backend pensará que test == 2
.
Esto también se puede usar para eludir restricciones de valor como:
Aquí utilizaremos el serializador de cada analizador para ver su respectiva salida.
Serializer 1 (por ejemplo, la biblioteca GoJay de GoLang) producirá:
description = "Duplicado con comentarios"
test = 2
extra = ""
Serializer 2 (por ejemplo, la biblioteca JSON-iterator de Java) producirá:
description = "Duplicado con comentarios"
extra = "/*"
extra2 = "*/"
test = 1
Alternativamente, el uso directo de comentarios también puede ser efectivo:
La biblioteca GSON de Java:
La biblioteca simdjson de Ruby:
El número
puede ser decodificado a múltiples representaciones, incluyendo:
Which might create inconsistencias
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)