Tema 15

15. Inyección SQL, NoSQL, comandos y técnicas de validación segura

Las inyecciones ocurren cuando datos no confiables son interpretados como instrucciones. Su impacto puede ir desde errores informativos hasta lectura de datos, modificación de registros o ejecución de comandos, por lo que deben validarse con especial cuidado.

Objetivo Comprender y validar inyecciones sin causar daño
Enfoque SQL, NoSQL, comandos y contexto de interpretación
Resultado Probar con evidencia mínima y remediación clara

15.1 Introducción

Una inyección aparece cuando una aplicación toma una entrada controlable por el usuario y la incorpora de forma insegura en una consulta, comando, expresión o estructura interpretada por otro componente.

Las inyecciones siguen siendo relevantes porque conectan entradas externas con sistemas sensibles: bases de datos, shells, motores de plantillas, directorios LDAP, parsers XML, consultas NoSQL y servicios internos.

En este tema veremos cómo reconocer, analizar y validar inyecciones SQL, NoSQL y de comandos, siempre con técnicas controladas que eviten extracción masiva, modificación de datos o interrupción de servicios.

15.2 Qué tienen en común las inyecciones

Todas las inyecciones comparten un patrón: la aplicación mezcla datos con instrucciones. El sistema receptor interpreta una parte de la entrada como lógica, no solo como valor.

  • El usuario controla un parámetro, cabecera, cookie, cuerpo o archivo.
  • La aplicación no separa correctamente datos e instrucciones.
  • El backend interpreta caracteres especiales, operadores o sintaxis.
  • El resultado altera la consulta, comando o expresión original.
  • El impacto depende de permisos, contexto y datos accesibles.
La defensa principal contra inyecciones no es filtrar caracteres sueltos, sino separar datos de instrucciones mediante APIs seguras y validación contextual.

15.3 Superficies de entrada

Las inyecciones no aparecen solo en formularios visibles. Cualquier dato procesado por el servidor puede ser una superficie de entrada.

Entrada Ejemplos Riesgo
URL Parámetros GET, IDs, filtros Alterar consultas o control de acceso
Cuerpo Formularios, JSON, XML Inyección en bases, comandos o parsers
Cabeceras User-Agent, X-Forwarded-For, Referer Logs, comandos, consultas o analytics
Cookies Preferencias, sesión, tracking Consultas o lógica basada en valores manipulables
Archivos CSV, XML, imágenes, documentos Procesamiento inseguro o inyección diferida
APIs internas Webhooks, colas, integraciones Datos de terceros tratados como confiables

15.4 Inyección SQL

La inyección SQL ocurre cuando una entrada altera una consulta SQL. Puede afectar búsquedas, filtros, login, reportes, APIs, paneles administrativos o cualquier función que consulte una base relacional.

Impactos posibles:

  • Bypass de autenticación.
  • Lectura de datos no autorizados.
  • Modificación o eliminación de registros.
  • Enumeración de estructura de base de datos.
  • Ejecución de funciones peligrosas según motor y permisos.
  • Escalada hacia otros sistemas mediante credenciales almacenadas.

La severidad depende de permisos de la cuenta de base de datos, exposición de la aplicación y datos accesibles.

15.5 Tipos de SQLi

Tipo Descripción Validación segura
Error-based Errores revelan comportamiento de la consulta Provocar error controlado sin extraer datos
Boolean-based La respuesta cambia según condición verdadera o falsa Comparar respuestas inocuas
Time-based La respuesta se retrasa según condición Usar retrasos mínimos y controlados
Union-based Combina resultados de consultas Evitar extracción masiva; usar marcador mínimo
Second-order La entrada se almacena y se ejecuta después Usar datos de prueba y flujo controlado

15.6 Señales de posible SQLi

No todas las señales confirman vulnerabilidad, pero ayudan a construir hipótesis.

  • Errores de base de datos visibles.
  • Diferencias de respuesta al introducir caracteres especiales.
  • Cambios anómalos en cantidad de resultados.
  • Retrasos consistentes ante entradas específicas.
  • Filtros que aceptan operadores inesperados.
  • Mensajes que revelan nombres de tablas, columnas o motores.
  • Comportamiento distinto entre parámetros aparentemente similares.
Un error SQL visible es una señal fuerte, pero la validación debe demostrar impacto sin consultar información sensible.

15.7 Validación segura de SQLi

La validación debe demostrar que la entrada altera la consulta sin extraer datos reales innecesarios.

  • Comparar respuestas con condiciones verdaderas y falsas controladas.
  • Usar registros de prueba cuando sea posible.
  • Evitar consultas que enumeren tablas completas.
  • Evitar modificar o borrar datos.
  • Usar retrasos mínimos en pruebas time-based.
  • Capturar fragmentos de error o diferencias de respuesta.
  • Detenerse cuando la evidencia demuestre el comportamiento vulnerable.

15.8 Inyección NoSQL

La inyección NoSQL ocurre cuando entradas no confiables alteran consultas en bases no relacionales, como MongoDB, CouchDB u otros motores. Puede aparecer especialmente en APIs JSON y filtros dinámicos.

Riesgos comunes:

  • Bypass de autenticación por operadores inesperados.
  • Consulta de documentos fuera de permisos.
  • Alteración de filtros de búsqueda.
  • Acceso a campos no previstos.
  • Abuso de consultas flexibles sin validación de esquema.

En NoSQL, el problema muchas veces no es un carácter especial, sino aceptar estructuras u operadores que el usuario no debería controlar.

15.9 Señales de NoSQLi

Señal Qué puede indicar Validación segura
JSON acepta objetos donde esperaba texto Falta de validación de esquema Enviar estructura inocua y observar diferencia
Filtros demasiado flexibles Operadores controlables por usuario Comparar resultados con datos de prueba
Login responde distinto ante estructuras Consulta manipulable Usar cuenta de laboratorio
Errores del motor NoSQL Entrada interpretada como consulta Capturar error sin extraer datos

15.10 Validación segura de NoSQLi

La validación segura de NoSQLi se basa en confirmar que el servidor acepta estructuras u operadores no esperados.

  • Trabajar con cuentas de laboratorio.
  • Enviar objetos o tipos inesperados de forma controlada.
  • Comparar respuestas entre valores normales y valores alterados.
  • No enumerar colecciones completas.
  • No intentar bypass de cuentas reales.
  • Registrar petición, respuesta y diferencia de comportamiento.

15.11 Inyección de comandos

La inyección de comandos ocurre cuando una entrada del usuario se incorpora a un comando del sistema operativo. Es especialmente grave porque puede permitir ejecutar acciones en el servidor con los permisos del proceso vulnerable.

Puede aparecer en funciones como:

  • Diagnóstico de red: ping, traceroute, nslookup.
  • Conversión de archivos.
  • Compresión o descompresión.
  • Procesamiento de imágenes o documentos.
  • Backups o tareas administrativas.
  • Integraciones con scripts del sistema.
En command injection, la validación debe usar comandos inocuos que no modifiquen el sistema ni accedan a datos sensibles.

15.12 Señales de inyección de comandos

  • La aplicación devuelve salida de comandos del sistema.
  • Errores mencionan shell, rutas o binarios.
  • Caracteres de separación alteran el comportamiento.
  • Retrasos consistentes ante entradas que provocan espera.
  • Conexiones salientes hacia un endpoint controlado.
  • Diferencias entre sistemas Linux y Windows según entrada.

La ausencia de salida visible no descarta la vulnerabilidad. Puede existir una inyección ciega que solo se observe por tiempo o interacción externa controlada.

15.13 Validación segura de command injection

La validación debe confirmar ejecución sin cambiar el sistema.

Objetivo Enfoque seguro Evitar
Confirmar ejecución Comando inocuo de identificación Descargar o ejecutar binarios externos
Confirmar sistema operativo Comando de versión o ruta controlada Leer archivos sensibles completos
Confirmar inyección ciega Tiempo mínimo o callback a endpoint propio Escanear redes internas
Confirmar permisos Mostrar usuario del proceso Intentar escalar privilegios sin autorización

15.14 Inyección LDAP

LDAP se usa para consultar directorios, usuarios y grupos. Una inyección LDAP ocurre cuando entradas no confiables alteran filtros de búsqueda o autenticación.

Riesgos posibles:

  • Bypass de autenticación.
  • Enumeración de usuarios.
  • Acceso a atributos no esperados.
  • Alteración de filtros de búsqueda.
  • Divulgación de estructura del directorio.

La validación debe evitar enumerar directorios completos y usar cuentas o datos de prueba cuando sea posible.

15.15 Inyección en plantillas

Server-Side Template Injection ocurre cuando una entrada llega a un motor de plantillas y se interpreta como expresión. Puede variar desde lectura de variables hasta ejecución de código, según motor y configuración.

  • Señales de evaluación de expresiones matemáticas o variables.
  • Errores que revelan motor de plantilla.
  • Diferencias entre contenido mostrado y contenido interpretado.
  • Contextos donde el usuario personaliza mensajes, plantillas o vistas.

La validación segura debe limitarse a expresiones inocuas y no intentar acceso a objetos internos sensibles sin autorización.

15.16 Inyección XML y XXE

Cuando una aplicación procesa XML, pueden aparecer riesgos como entidades externas, expansión excesiva o lectura de recursos internos. XXE ocurre cuando el parser permite entidades externas inseguras.

Validación segura:

  • Confirmar si el parser acepta entidades externas usando endpoint controlado.
  • No leer archivos sensibles del servidor.
  • No provocar expansión masiva de entidades.
  • Registrar petición y respuesta mínima.
  • Verificar configuración del parser si el cliente provee acceso.

15.17 Inyecciones ciegas

Una inyección ciega no muestra el resultado directamente. Se detecta por diferencias de tiempo, comportamiento, errores indirectos o interacción con un recurso controlado.

  • Time-based: la respuesta tarda más cuando la condición se cumple.
  • Boolean-based: cambia el contenido o estado de la respuesta.
  • Out-of-band: el servidor realiza una consulta o conexión externa observable.

Estas pruebas deben ser especialmente cuidadosas para no generar carga, bucles o conexiones no autorizadas.

15.18 Evitar daño durante validación

Las inyecciones pueden tener impacto alto. La validación debe evitar acciones destructivas.

  • No modificar datos de producción.
  • No borrar registros.
  • No extraer tablas completas.
  • No ejecutar comandos persistentes.
  • No descargar herramientas externas al servidor.
  • No consultar servicios internos fuera de alcance.
  • Usar delays cortos y limitados en pruebas de tiempo.
  • Detenerse cuando la evidencia sea suficiente.
Una validación segura debe ser proporcional. Si una comparación de respuestas demuestra la inyección, no hace falta extraer datos reales.

15.19 Prevención de SQLi

La prevención de inyección SQL se basa en separar datos de instrucciones y limitar impacto si algo falla.

  • Consultas parametrizadas o prepared statements.
  • ORM usado correctamente, sin concatenación insegura.
  • Validación de tipos, formatos y rangos.
  • Principio de mínimo privilegio en cuentas de base de datos.
  • Errores genéricos para usuarios y logs detallados protegidos.
  • Revisión de consultas dinámicas.
  • Pruebas automatizadas de seguridad en rutas críticas.

15.20 Prevención de NoSQLi

En NoSQL, la prevención depende de validar estructura, tipos y operadores aceptados.

  • Validar esquemas de JSON de entrada.
  • Rechazar objetos donde se esperan cadenas o números.
  • No permitir operadores de consulta desde entrada directa.
  • Usar APIs seguras del driver.
  • Aplicar listas permitidas de campos filtrables.
  • Limitar permisos de la cuenta usada por la aplicación.
  • Registrar intentos con estructuras inesperadas.

15.21 Prevención de command injection

La mejor prevención es evitar invocar comandos del sistema con entrada de usuario. Si no hay alternativa, deben aplicarse controles estrictos.

  • Usar APIs nativas en lugar de shell.
  • Separar argumentos en llamadas seguras, sin concatenar cadenas.
  • Aplicar listas permitidas de valores.
  • Validar tipos, longitud y caracteres permitidos.
  • Ejecutar procesos con privilegios mínimos.
  • Evitar interpretar metacaracteres de shell.
  • Registrar y alertar entradas anómalas.

15.22 Evidencia en hallazgos de inyección

La evidencia debe mostrar la diferencia entre entrada normal y entrada manipulada, sin revelar datos sensibles innecesarios.

Hallazgo Evidencia útil Evitar
SQLi Comparación de respuestas o error controlado Dump de tablas
NoSQLi Diferencia por tipo u operador inesperado Enumerar colecciones completas
Command injection Salida de comando inocuo o callback controlado Instalar binarios o leer secretos
LDAP injection Cambio de resultado con filtro controlado Listar directorio completo
SSTI Evaluación de expresión inocua Acceder a objetos internos sensibles

15.23 Errores frecuentes

  • Probar inyecciones solo en parámetros visibles y olvidar JSON, cookies o cabeceras.
  • Extraer datos reales cuando una prueba controlada era suficiente.
  • Usar delays largos que afectan disponibilidad.
  • Confundir error con impacto explotable.
  • No validar si la cuenta de base tiene permisos limitados.
  • Probar command injection con comandos que modifican el sistema.
  • Depender solo de herramientas automáticas.
  • No documentar entrada normal, entrada de prueba y diferencia observada.

15.24 Flujo práctico de validación

Un flujo responsable para validar inyecciones puede ser:

  1. Identificar entradas controlables.
  2. Determinar el contexto probable: SQL, NoSQL, shell, LDAP, plantilla o XML.
  3. Probar cambios inocuos y observar diferencias.
  4. Comparar respuesta normal y respuesta alterada.
  5. Usar datos de laboratorio siempre que sea posible.
  6. Evitar extracción, modificación o comandos peligrosos.
  7. Recolectar evidencia mínima.
  8. Asignar severidad según impacto real.
  9. Recomendar prevención específica para el contexto.

15.25 Qué debes recordar de este tema

  • Las inyecciones ocurren cuando datos no confiables se interpretan como instrucciones.
  • SQLi, NoSQLi y command injection comparten el problema de mezclar datos y lógica.
  • La validación debe demostrar impacto sin extraer ni modificar datos innecesariamente.
  • Las inyecciones ciegas requieren paciencia y límites para no afectar disponibilidad.
  • La prevención se basa en parametrización, validación de esquema, APIs seguras y mínimo privilegio.
  • La evidencia debe comparar comportamiento normal y manipulado con claridad.

15.26 Conclusión

Las inyecciones siguen siendo una familia crítica de vulnerabilidades porque conectan entradas externas con sistemas de alto valor. Validarlas exige precisión, control y respeto por los datos.

En el próximo tema estudiaremos XSS, CSRF, SSRF, deserialización insegura y fallas de control de acceso, ampliando el análisis hacia vulnerabilidades de navegador, sesiones, llamadas internas y autorización.