Skip to content

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 = 1

Si 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 ​

TipoCómo se ve
UNIONLos resultados de mi consulta aparecen en la página
Basada en erroresLa 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 bandaLa base de datos me llama a un servidor mío

Ataque UNION paso a paso ​

  1. Averiguar cuántas columnas devuelve la consulta: ' ORDER BY 1--, ORDER BY 2--… hasta que falle.
  2. Saber qué columnas aceptan texto: ' UNION SELECT 'a',NULL--.
  3. Listar tablas: ' UNION SELECT table_name,NULL FROM information_schema.tables--.
  4. 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 --dbs

Automatiza 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.

Laboratorios completados ​

Ver PortSwigger → SQL Injection.

Contenido propio con fines educativos. Sin flags ni material de exámenes.