introduccion-y-conceptos
Introducción y conceptos
Section titled “Introducción y conceptos”¿Qué es SQL Injection?
Section titled “¿Qué es SQL Injection?”SQL Injection (SQLi) es una vulnerabilidad que permite a un atacante interferir con las consultas SQL que una aplicación realiza a su base de datos. Se produce cuando la entrada del usuario se incorpora directamente en una consulta sin la debida sanitización.
-- Consulta original legítimaSELECT * FROM users WHERE username = 'admin' AND password = '1234';
-- Consulta inyectadaSELECT * FROM users WHERE username = 'admin' --' AND password = 'anything';¿Por qué ocurre?
Section titled “¿Por qué ocurre?”- Concatenación directa de input del usuario en queries SQL
- Falta de prepared statements / consultas parametrizadas
- Validación o sanitización insuficiente del input
- Errores de base de datos expuestos al usuario
Tipos de SQL Injection
Section titled “Tipos de SQL Injection”| Tipo | Descripción | Respuesta visible |
|---|---|---|
| In-Band > Error-Based | Extrae datos a través de errores SQL | Sí |
| In-Band > Union-Based | Extrae datos añadiendo UNION SELECT | Sí |
| Blind > Boolean-Based | Infiere datos por True/False | No directamente |
| Blind > Time-Based | Infiere datos por tiempo de respuesta | No directamente |
| Out-of-Band | Exfiltra datos por canal externo (DNS/HTTP) | No directamente |
Identificación básica
Section titled “Identificación básica”Caracteres de prueba iniciales
Section titled “Caracteres de prueba iniciales”'''`')"))' OR '1'='1' OR 1=1--" OR "1"="1# comentario MySQL-- comentario SQL/* comentario */Comportamientos que indican SQLi
Section titled “Comportamientos que indican SQLi”- Error de base de datos visible (
You have an error in your SQL syntax...) - Cambio en el comportamiento de la aplicación (más/menos resultados)
- Respuestas condicionales diferentes (
TRUEvsFALSE) - Tiempos de respuesta anómalos
Prueba rápida
Section titled “Prueba rápida”Input normal: https://target.com/item?id=1Prueba: https://target.com/item?id=1'Resultado: Error SQL → posible SQLiContextos de inyección
Section titled “Contextos de inyección”-- En cadena de texto (string context)SELECT * FROM users WHERE name = '[INPUT]'
-- En contexto numéricoSELECT * FROM users WHERE id = [INPUT]
-- En cláusula ORDER BYSELECT * FROM users ORDER BY [INPUT]
-- En nombre de tabla/columna (no se puede parametrizar)SELECT [INPUT] FROM usersBases de datos más comunes y diferencias clave
Section titled “Bases de datos más comunes y diferencias clave”| Caraterísticas | MySQL | PostgreSQL | MSSQL | Oracle |
|---|---|---|---|---|
| Comentario línea | -- / # |
-- |
-- |
-- |
| Comentario bloque | /* */ |
/* */ |
/* */ |
/* */ |
| Concatenación | CONCAT() / ` |
` | ` | |
| Versión | @@version |
version() |
@@version |
v$version |
| Base de datos actual | database() |
current_database() |
db_name() |
ora_database_name |
| Tablas del sistema | information_schema |
information_schema |
information_schema |
all_tables |
| Sleep | SLEEP(n) |
pg_sleep(n) |
WAITFOR DELAY |
dbms_pipe.receive_message |
Estructura de information_schema en MySQL, PostgreSQL y MSSQL
Section titled “Estructura de information_schema en MySQL, PostgreSQL y MSSQL”-- Listar todas las bases de datosSELECT schema_name FROM information_schema.schemata;
-- Listar tablas de una base de datosSELECT table_name FROM information_schema.tables WHERE table_schema = 'target_db';
-- Listar columnas de una tablaSELECT column_name FROM information_schema.columns WHERE table_name = 'users';Impacto potencial
Section titled “Impacto potencial”- Bypass de autenticación - acceso como admin sin credenciales
- Extracción de datos - credenciales, datos personales, tokens
- Modificación de datos - INSERT, UPDATE, DELETE
- Ejecución de comandos - si hay xp_cmdshell, UDF, etc.
- Lectura y escritura de archivos - MySQL con FILE privilege
Claves en SQL injection
Section titled “Claves en SQL injection”Siempre probar primero con un
'para confirmar si hay error. Si no hay error visible, pasar a técnicas blind.
Identificar el gestor de base de datos antes de lanzar payloads específicos. Un payload MySQL no funcionará en Oracle.
Revisar siempre los parámetros GET, POST, cookies, headers (User-Agent, Referer, X-Forwarded-For).