Otras inyecciones: comandos, plantillas, cabeceras y más
Guía en castellano sobre inyecciones distintas de SQL: comandos del sistema, plantillas (SSTI), CRLF en cabeceras HTTP, correo (SMTP) y LDAP.
Qué es
Todas las inyecciones comparten la misma idea: un dato del usuario acaba mezclado con una orden y el sistema que la interpreta no distingue dónde termina una y empieza el otro. La inyección SQL es la más conocida, pero el mismo error aparece en cualquier lenguaje que la aplicación construya con texto.
Tipos frecuentes
- Inyección de comandos: el dato llega a una orden del sistema. Caracteres como
;,|o$()permiten encadenar órdenes propias. - Inyección de plantillas en el servidor (SSTI): el texto del usuario se procesa como plantilla (Jinja2, Twig, Freemarker…). Una prueba clásica es escribir
{{7*7}}y ver si aparece49. Suele acabar en ejecución de código. - CRLF en cabeceras HTTP: saltos de línea (
%0d%0a) en un valor que va a una cabecera permiten añadir cabeceras propias, como cookies, o partir la respuesta. - Inyección en correos (SMTP): saltos de línea en campos como el asunto o el remitente que añaden destinatarios o cambian el mensaje.
- LDAP, XPath, NoSQL: consultas a directorios o bases de datos no relacionales construidas con texto del usuario. En NoSQL es típico enviar operadores como
{"$ne": null}en lugar de un valor. - Inyección de argumentos: el dato no rompe la orden, pero se interpreta como una opción (
--output=…) del programa al que se llama.
Cómo se busca
- Identifica a qué sistema llega cada dato: una orden, una plantilla, una cabecera, un correo, una consulta.
- Prueba los caracteres especiales de ese sistema concreto y observa si cambian la respuesta, el tiempo o el resultado.
- Para las inyecciones a ciegas, usa esperas o peticiones a un servidor propio para confirmar la ejecución.
Cómo se evita
- Pasar los datos por separado de la orden: APIs que reciben los argumentos en una lista, consultas parametrizadas, variables de plantilla en lugar de plantillas construidas con texto.
- Rechazar saltos de línea en todo lo que acaba en cabeceras o correos (las librerías actuales suelen hacerlo).
- Validar el tipo de dato: si se espera un texto, no aceptar un objeto.
- Usar
--para separar opciones de argumentos al llamar a programas externos.
Al reportarlo
Di qué intérprete recibe el dato y demuestra el efecto con la prueba más pequeña posible. En las de comandos y plantillas, la ejecución de una orden inocua suele bastar.
Casos reales de Otras inyecciones
Inyección de HTML en el correo del formulario de contacto de Essity permitía phishing desde su propia infraestructura
El campo firstName del formulario de contacto se insertaba sin escapar en el correo de confirmación, así que cualquiera podía meter enlaces con estilo propio en un email auténtico de la marca y mandarlo a la dirección que quisiera.
4 min
Node.js (llhttp) aceptaba un CR suelto como fin de la línea de estado en respuestas HTTP, incluso en modo estricto
El parser de respuestas de llhttp, incluido en Node.js, daba por buena una línea de estado terminada en \r\r en lugar de \r\n. Las peticiones sí lo rechazaban, y esa asimetría abre la puerta a desincronizar conexiones detrás de un proxy.
7 min
Inyección de HTML en la página de inicio de sesión ADFS de Essity mediante los parámetros infotext y signintext
Un script de tema del login federado (ADFS) de Essity insertaba con innerHTML los parámetros infotext y signintext de la URL, lo que permitía colocar avisos y enlaces falsos en una página de acceso legítima.
2 min
Request smuggling en Node.js: un tabulador tras "Connection: close" mantiene viva la conexión
El parser llhttp de Node.js ignoraba "Connection: close" si el valor terminaba en un tabulador. La conexión seguía abierta y los bytes tras el cuerpo se interpretaban como una segunda petición HTTP.
5 min
Roundcube: inyección de cabeceras SMTP persistente a través del campo "organización" de la identidad
El campo organization de las identidades de Roundcube se guardaba sin quitar saltos de línea y se copiaba tal cual a la cabecera Organization, lo que permitía añadir cabeceras como Bcc o From a todos los correos enviados.
3 min