Query SQL Forense
Proceso de análisis forense de consultas SQL (Structured Query Language) en bases de datos para detectar accesos no autorizados, extracción de datos confidenciales, inyecciones SQL maliciosas o alteración de registros en investigaciones judiciales.
¿Qué es el Análisis Forense de Queries SQL?
El análisis forense de queries SQL es la técnica de investigación digital que examina las consultas SQL ejecutadas en bases de datos para:
- Detectar accesos no autorizados - Quién accedió a datos sensibles y cuándo
- Identificar inyecciones SQL - Ataques que explotan vulnerabilidades de input
- Rastrear modificaciones - INSERT, UPDATE, DELETE no autorizados
- Documentar extracción masiva - Descargas anormales de datos (data breach)
- Reconstruir actividad - Timeline completo de operaciones en la base de datos
Marco de Aplicación
Casos típicos: fraudes internos (empleados que acceden a datos de clientes), brechas de seguridad (hackers explotando vulnerabilidades SQL), litigios laborales (empleado descargó base de datos antes de irse), cumplimiento RGPD (auditorías de accesos a datos personales).
¿Dónde Se Encuentran las Queries SQL?
1. Logs del Servidor de Base de Datos
MySQL/MariaDB:
# Las rutas dependen de la distribución y de la configuración.
# Consultar las variables, no asumir el camino:
# SHOW VARIABLES LIKE 'general_log%'; SHOW VARIABLES LIKE 'slow_query_log%';
/var/log/mysql/mysql.log # ubicación habitual en Debian/Ubuntu
/var/log/mysql/mysql-slow.log # Slow queriesPostgreSQL:
# log_directory: por defecto 'log', relativo al directorio de datos. Consultar:
# SHOW log_directory; SHOW data_directory;
# NO suponer la ruta
log_statement / log_min_duration_statement # qué consultas registra el server logSQL Server:
Extended Events sessions # el mecanismo vigente
SQL Server Profiler traces # en desuso: sustituido por Extended Events
Default trace # traza ligera de eventos de configuración,
# NO un registro de las consultas ejecutadasOracle:
Unified Auditing # auditoría de accesos (audit_trail en versiones previas)
AWR # métricas de RENDIMIENTO y SQL agregado por plan;
# no es el registro de cada consulta ejecutada
LogMiner # lectura de los redo logs: qué cambió y cuándo2. Logs de Aplicación
Las aplicaciones web suelen logear queries ejecutadas:
[2025-03-15 14:23:45] SELECT * FROM usuarios WHERE email='juan@example.com'
[2025-03-15 14:23:47] UPDATE usuarios SET password='...' WHERE id=12345
[2025-03-15 14:23:50] DELETE FROM logs WHERE fecha < '2025-01-01'3. Estadísticas de ejecución en memoria
No es un registro de lo ocurrido, y confundirlo con uno lleva a conclusiones falsas:
- MySQL:
performance_schema.events_statements_historysí guarda las últimas sentencias por hilo, con su texto - PostgreSQL:
pg_stat_statementsno guarda un histórico: acumula estadísticas agregadas por consulta normalizada —número de ejecuciones, tiempos— sin los valores de los parámetros ni el momento de cada llamada - SQL Server:
sys.dm_exec_query_stats
4. Binlog / Transaction Log
Registro de transacciones para replicación y recuperación:
- MySQL: binlog files (recuperación punto-a-punto)
- PostgreSQL: WAL (Write-Ahead Log)
- SQL Server: Transaction log (.ldf)
Volatilidad de la Evidencia
Los logs SQL son altamente volátiles. Cuánto duran depende de cómo se haya configurado la rotación, y en varios motores el registro de consultas está apagado de fábrica: puede que no exista nada que preservar. En investigaciones, es crítico preservar inmediatamente los logs antes de que se sobrescriban.
Técnicas Forenses de Análisis SQL
1. Análisis de Inyecciones SQL
Qué buscar:
Queries con patrones típicos de inyección:
-- Bypass de autenticación
SELECT * FROM users WHERE username='admin'--' AND password='X'
-- Extracción de datos (UNION-based)
SELECT nombre FROM productos WHERE id=1 UNION SELECT password FROM usuarios--
-- Blind SQL injection
SELECT * FROM users WHERE id=1 AND 1=1-- (TRUE)
SELECT * FROM users WHERE id=1 AND 1=0-- (FALSE)
-- Time-based blind
SELECT * FROM users WHERE id=1 AND SLEEP(5)--Indicadores forenses:
- Comentarios SQL en queries (
--,/**/,#) - UNION SELECT inesperados
- Funciones de tiempo (SLEEP, WAITFOR DELAY)
- Queries con sintaxis malformada
- Múltiples intentos fallidos seguidos de uno exitoso
2. Rastreo de Accesos No Autorizados
Análisis temporal:
-- Accesos fuera de horario laboral
SELECT user, query_text, timestamp
FROM query_log
WHERE HOUR(timestamp) NOT BETWEEN 8 AND 18
AND user='empleado_interno';
-- Accesos anormales a tablas sensibles
SELECT user, COUNT(*) as num_queries
FROM query_log
WHERE query_text LIKE '%clientes%' OR query_text LIKE '%tarjetas%'
GROUP BY user
HAVING COUNT(*) > 1000;3. Detección de Extracción Masiva
Patrones sospechosos:
-- SELECT masivos (sin WHERE = toda la tabla)
SELECT * FROM clientes;
SELECT * FROM transacciones;
SELECT * FROM usuarios;
-- Exportaciones con OUTFILE
SELECT * INTO OUTFILE '/tmp/clientes.csv' FROM clientes;
-- Queries con LIMIT altos (paginación de extracción)
SELECT * FROM usuarios LIMIT 0, 10000;
SELECT * FROM usuarios LIMIT 10000, 10000;
...Indicadores forenses:
- Queries SELECT sin cláusulas WHERE
- Uso de INTO OUTFILE o exportación
- Secuencias de queries con LIMIT incremental
- Volumen inusual de queries por usuario/IP
- Queries a múltiples tablas en corto período
4. Análisis de Modificaciones/Borrados
Reconstrucción de cambios:
-- UPDATEs sospechosos
UPDATE usuarios SET rol='admin' WHERE id=12345; -- Escalada de privilegios
UPDATE logs SET fecha='2024-01-01' WHERE id > 5000; -- Manipulación temporal
DELETE FROM audit_log WHERE user='empleado_sospechoso'; -- Borrado de evidencia
-- Análisis del binlog de MySQL para recuperar queries ejecutadas:
# El formato por defecto en MySQL 8 es ROW: sin --verbose el SQL no aparece como texto.
# Y la ruta se consulta, no se supone: SHOW VARIABLES LIKE 'log_bin_basename';
mysqlbinlog --verbose --base64-output=DECODE-ROWS "$BINLOG" | grep -i "DELETE"Herramientas Forenses para Análisis SQL
1. Análisis de Logs
| Herramienta | Uso | Base de Datos |
|---|---|---|
| mysqlbinlog | Recuperar queries desde binlog | MySQL/MariaDB |
| pg_waldump | Analizar Write-Ahead Log | PostgreSQL |
| Extended Events (SQL Server) | Captura en tiempo real. Profiler está en desuso desde SQL Server 2012 y Microsoft recomienda no usarlo para captura nueva | SQL Server |
| Oracle LogMiner | Análisis de archive logs | Oracle |
2. Análisis de Inyecciones SQL
| Herramienta | Descripción |
|---|---|
| SQLMap | Detección automática de vulnerabilidades SQL injection |
| Burp Suite | Proxy para analizar peticiones HTTP con queries SQL |
| ModSecurity | WAF que logea intentos de inyección SQL |
3. Análisis de Performance y Actividad
| Herramienta | Uso |
|---|---|
| pt-query-digest (Percona) | Análisis de slow query log de MySQL |
| pgBadger | Análisis de logs PostgreSQL con gráficos |
| SQL Sentry | Monitorización forense de SQL Server |
Casos de Uso en Peritaje Informático
Escenarios ilustrativos
Los tres casos de esta sección son escenarios construidos para explicar la metodología forense de análisis de queries SQL: los usuarios, las marcas de tiempo, los recuentos de registros e importes son ficticios y no corresponden a ningún expediente ni persona identificable. Las técnicas y consultas descritas sí son reales.
Caso 1: Empleado Descarga Base de Datos Antes de Irse
Situación: Empresa sospecha que empleado descargó base de clientes antes de renunciar para llevarla a competencia
Análisis forense:
Identificar usuario/IP del empleado
SELECT DISTINCT user, host FROM mysql.user WHERE user='empleado_sospechoso';Analizar queries ejecutadas en período crítico
-- Las columnas reales de mysql.general_log son event_time, user_host, -- thread_id, server_id, command_type y argument SELECT event_time, user_host, argument FROM mysql.general_log WHERE user_host LIKE 'empleado_sospechoso%' AND event_time BETWEEN '2025-03-10' AND '2025-03-15' ORDER BY event_time;Buscar exportaciones o SELECT masivos
SELECT event_time, user_host, argument FROM mysql.general_log WHERE argument LIKE '%SELECT%clientes%' AND argument NOT LIKE '%WHERE%' -- Sin filtros = extracción completa AND user_host LIKE 'empleado_sospechoso%';Contar las consultas del periodo (que no es lo mismo que medir lo extraído)
SELECT DATE(event_time) AS fecha, COUNT(*) AS num_consultas FROM mysql.general_log WHERE user_host LIKE 'empleado_sospechoso%' GROUP BY DATE(event_time);
Evidencia encontrada:
- 15/03/2025 14:23:12 -
SELECT * FROM clientes;(30.000 registros) - 15/03/2025 14:25:34 -
SELECT * FROM contratos;(15.000 registros) - 15/03/2025 14:27:01 -
SELECT * FROM precios;(5.000 registros)
→ Lo que esto acredita: que el servidor recibió esas consultas. No que el cliente recibiera todas las filas ni que se exfiltraran: el registro cuenta sentencias, no resultados entregados. Para sostener el volumen hacen falta otros artefactos —tráfico de red, ficheros creados, logs de la aplicación—.
Caso 2: Inyección SQL en E-commerce
Situación: Tienda online sufrió acceso no autorizado a datos de tarjetas de clientes
Análisis forense:
Analizar logs de aplicación web
[2025-03-20 03:45:12] 192.168.1.100 - SQL: SELECT * FROM productos WHERE id='1' OR '1'='1' [2025-03-20 03:45:23] 192.168.1.100 - SQL: SELECT * FROM productos WHERE id='1' UNION SELECT NULL,NULL,NULL-- [2025-03-20 03:47:01] 192.168.1.100 - SQL: SELECT * FROM productos WHERE id='1' UNION SELECT username,password,email FROM usuarios--Reconstruir ataque exitoso
- Identificar payload que funcionó
- Determinar qué datos fueron extraídos
- Calcular alcance (número de registros comprometidos)
Rastrear origen del atacante
- IP de origen (puede ser proxy/VPN)
- User-Agent, headers HTTP
- Timing de ataques (automatizado vs manual)
Evidencia encontrada:
- 127 intentos de inyección SQL desde misma IP
- Extracción exitosa de tabla
usuarios(1.234 registros) - Extracción de tabla
pagos(567 registros con datos de tarjetas)
→ Conclusión pericial: Brecha de seguridad por inyección SQL, datos personales y financieros comprometidos
Caso 3: Modificación Fraudulenta de Registros Contables
Situación: Auditoría detecta discrepancias en base de datos contable, sospecha de manipulación interna
Análisis forense:
Analizar transaction log (binlog)
mysqlbinlog --verbose --base64-output=DECODE-ROWS "$BINLOG" | grep -i UPDATE | grep facturasIdentificar UPDATEs anómalos
-- Facturas modificadas después de cierre contable UPDATE facturas SET importe=50000 WHERE id=12345 AND fecha='2024-12-31';Reconstruir valores originales
- Uso de binlog para rollback conceptual
- Comparar con backups anteriores
- Identificar usuario que realizó modificación
Timeline de modificaciones
2025-01-15 23:45:12 - Usuario: admin_contable - UPDATE facturas SET importe=50000 WHERE id=12345 2025-01-15 23:45:34 - Usuario: admin_contable - UPDATE facturas SET importe=35000 WHERE id=12346 2025-01-15 23:46:01 - Usuario: admin_contable - DELETE FROM audit_log WHERE fecha='2025-01-15'
Evidencia encontrada:
- 23 facturas modificadas fuera de horario laboral
- Montos incrementados artificialmente (+450.000€)
- Intento de borrar logs de auditoría
→ Conclusión pericial: Fraude contable interno con evidencia digital clara
Preservación de Evidencia SQL
Protocolo de Preservación Inmediata
Preservar antes de tocar nada, y no «detener la rotación»
⚠️
FLUSH LOGSno detiene la rotación: la provoca — cierra el fichero actual y abre uno nuevo. Ymax_binlog_sizefija el tamaño al que se rota, no la retención, que la gobiernabinlog_expire_logs_seconds. Ejecutar esos dos comandos sobre un servidor bajo investigación altera la evidencia.Lo correcto es copiar primero (paso 2) y solo después, con la evidencia ya asegurada, ampliar la ventana de retención. Y al ampliarla, comprobar el valor actual antes de escribir uno nuevo:
2592000segundos son treinta días, que es el valor por defecto de MySQL 8 — ponerlo a ciegas puede dejar la retención igual o acortarla, no ampliarla.-- 1) mirar qué hay antes de tocar nada SELECT @@binlog_expire_logs_seconds; -- 2) ampliar solo si el valor actual es menor (NO usar FLUSH LOGS aquí) SET GLOBAL binlog_expire_logs_seconds = 7776000; -- 90 díasEn PostgreSQL,
ALTER SYSTEMescribe configuración persistente enpostgresql.auto.conf: es una modificación del servidor investigado y hay que documentarla como tal, o dejarla para después de la copia.SHOW wal_keep_size; ALTER SYSTEM SET wal_keep_size = '10GB';Crear copias forenses de logs
# Calcular hash SHA-256 antes de copiar # Con rutas RELATIVAS: un manifiesto con /var/log/... no se puede verificar sobre la copia cd "$DIR_BINLOGS" && sha256sum ./* > /evidencia/hashes_originales.txt # Copiar logs a ubicación segura cp -a /var/log/mysql/* /evidencia/logs_mysql/ # Verificar hash tras copia cd /evidencia/logs_mysql/ sha256sum -c /evidencia/hashes_originales.txtExportar estado actual de bases de datos
# Dump completo con timestamps # SIN --flush-logs: rotaría el binlog del servidor investigado, que es justo lo que el paso 1 advierte mysqldump --all-databases --single-transaction > backup_forense.sql # Calcular hash sha256sum backup_forense.sql > backup_hash.txtDocumentar configuración del servidor
-- MySQL: Exportar configuración de logging SHOW VARIABLES LIKE '%log%'; SHOW VARIABLES LIKE '%audit%'; -- PostgreSQL SHOW log_statement; SHOW log_min_duration_statement;
NUNCA Trabajar sobre Logs Originales
Los logs SQL deben ser copiados inmediatamente a ubicación forense con verificación de hash. Cualquier análisis debe realizarse sobre las copias, manteniendo los originales intactos para contraperitaje.
Limitaciones del Análisis SQL Forense
❌ Limitación 1: Logs No Habilitados
Problema: el registro de consultas viene desactivado de fábrica en los motores más comunes —el general_log y el slow_query_log de MySQL, por ejemplo, tienen OFF como valor por defecto—. No es una mala configuración del cliente: es el comportamiento estándar.
Solución: Verificar inmediatamente si hay logs disponibles. Si no, el análisis forense se limita a:
- Analizar estructuras de tablas (detectar modificaciones)
- Comparar con backups anteriores
- Analizar logs de aplicación (si los hay)
❌ Limitación 2: Logs Ya Rotados
Problema: Los logs rotan cada X días y se pierden si no hay retención configurada
Solución: Actuar rápidamente. Cada día que pasa reduce la ventana de evidencia disponible.
❌ Limitación 3: Queries Ofuscadas
Problema: Atacantes sofisticados ofuscan queries SQL:
-- Query normal
SELECT password FROM users WHERE id=1;
-- Query ofuscada
SEL/**/ECT/**/password/**/FR/**/OM/**/users/**/WHE/**/RE/**/id=1;Solución: Análisis con expresiones regulares y técnicas de de-ofuscación.
❌ Limitación 4: Accesos Directos a Archivos
Problema: Si el atacante tiene acceso físico a archivos de base de datos (.ibd, .frm), puede leerlos sin generar queries
Solución: Análisis forense del sistema operativo (accesos a archivos, logs de sistema)
Conclusión
El análisis forense de queries SQL es fundamental para investigaciones de fraudes internos, brechas de seguridad y litigios relacionados con bases de datos. La clave del éxito es la preservación inmediata de logs antes de que roten y la aplicación de técnicas forenses rigurosas para reconstruir la actividad en la base de datos.
¿Tienes un caso con evidencia digital de por medio?
Una valoración previa dice qué evidencia existe, en qué estado está y si es técnicamente preservable, antes de invertir en el procedimiento.
Referencias y fuentes
- MySQL 8.0 Reference Manual — The General Query Log, The Slow Query Log y Server System Variables: ambos registros tienen
OFFcomo valor por defecto. - MySQL 8.0 — The Binary Log y mysqlbinlog. El binlog registra los cambios, no las consultas de solo lectura.
- PostgreSQL 18 — Error Reporting and Logging, pg_stat_statements —estadísticas agregadas, no un registro de consultas— y pg_waldump.
- Microsoft — Extended Events Overview, SQL Server Profiler (en desuso) y The Transaction Log.
- Oracle Database 19c — Introduction to Auditing y Using LogMiner to Analyze Redo Log Files.
- RGPD — Reglamento (UE) 2016/679, art. 32 sobre seguridad del tratamiento.
- NIST — SP 800-61 Computer Security Incident Handling Guide. La revisión 2 que enlaza este PDF fue retirada el 3 de abril de 2025; la vigente es la Rev. 3. Sobre preservación de evidencia volátil.
Última actualización: 29 de agosto de 2026 Categoría: Técnico Código: QSF-001
Artículos relacionados:
Preguntas Frecuentes
¿Qué se puede detectar con análisis forense de queries SQL?
Accesos no autorizados a bases de datos, inyecciones SQL maliciosas, extracción masiva de datos (data breaches), alteración de registros, borrado de evidencia, y actividad de usuarios específicos mediante análisis de logs de transacciones y query history.
¿Dónde se almacenan los logs de queries SQL?
En MySQL, el general query log y el slow query log —ambos desactivados por defecto—. En PostgreSQL, el log del servidor configurado con log_statement; pg_stat_statements no es un registro de consultas sino una extensión de estadísticas agregadas. En SQL Server, Extended Events, que sustituyó a Profiler, este último en desuso. En Oracle, la auditoría unificada; el AWR guarda métricas de rendimiento, no el texto de cada consulta. La ubicación exacta depende de la configuración del servidor.
¿Cuánto tiempo se conservan los logs SQL?
No hay un plazo por defecto que se pueda dar por bueno: la retención depende enteramente de cómo esté configurado el servidor, y en varios motores el registro de consultas ni siquiera está activado. Por eso lo primero en una investigación es comprobar qué se está registrando y desde cuándo, en vez de asumir una ventana. Sin configuración específica, los logs rotan y se pierden.
Términos Relacionados
Perito Informático
Profesional experto en tecnología que analiza evidencias digitales y elabora informes periciales con validez legal para procedimientos judiciales.
Evidencia Digital
Información digital (archivos, logs, mensajes) con valor probatorio en juicio. Su peso depende de que se pueda sostener su autenticidad e integridad, y la licitud de la obtención se juzga aparte, por el art. 11.1 LOPJ.
Análisis Forense Digital
Conjunto de procedimientos científicos y técnicos para identificar, preservar y analizar evidencias digitales admisibles en juicios civiles, penales o laborales.
¿Necesitas un peritaje forense?
Si necesitas ayuda profesional con análisis forense digital, estoy aquí para ayudarte.
Solicitar Consulta Gratuita
