Una comilla. Eso es todo lo que necesitas para romper un login

SQL Injection es una de las vulnerabilidades más antiguas y más explotadas del mundo. Con una sola comilla puedes tumbar una base de datos entera.

⚡ Ir al laboratorio (puede tardar en levantarse)

Lo que necesitas: un navegador. El ataque se hace desde el formulario del laboratorio.


¿Qué es SQL Injection?

Las webs guardan sus datos en una base de datos — un sistema que almacena usuarios, contraseñas, pedidos, mensajes… Para consultar esa base de datos usan un lenguaje llamado SQL.

Cuando haces login, la web construye una consulta SQL con lo que escribiste:

SELECT * FROM usuarios WHERE nombre='mario' AND password='1234'

Traducido: “busca en la tabla usuarios a alguien que se llame mario y tenga la contraseña 1234”.

Si el usuario existe y la contraseña es correcta, te deja pasar. Hasta aquí todo normal.

El problema: hay webs que meten directamente lo que escribes en esa consulta sin revisarlo. Eso significa que puedes meter código SQL en vez de tu nombre, y cambiar la lógica de la consulta.


¿Cómo se explota?

Escribe esto en el campo usuario:

' OR '1'='1

La web construye esta consulta:

SELECT * FROM usuarios WHERE nombre='' OR '1'='1' AND password='1234'

Fíjate en OR '1'='1'. Eso es siempre verdadero — uno siempre es igual a uno. La base de datos devuelve todos los usuarios y la web te da acceso. Has entrado sin saber ninguna contraseña.

La comilla del principio cierra el campo nombre antes de tiempo, y lo que viene después ya es código SQL tuyo.

Para confirmar que es vulnerable: escribe solo ' en el campo usuario y envía. Si aparece un error con palabras como syntax error o SQL, está confirmado — la web está mezclando tu texto con su código.

Variantes — distintas bases de datos usan símbolos distintos para los comentarios:

' OR 1=1--
' OR 1=1#
' OR '1'='1' --

El -- y el # convierten todo lo que viene después en un comentario, para que el resto de la consulta no dé error de sintaxis.


🎯 Tu reto

Accede al panel de administración del laboratorio sin conocer ninguna contraseña.


🛡️ Cómo se protege

Con consultas parametrizadas: en vez de meter el texto del usuario directamente en la consulta, se le dice a la base de datos “aquí va un dato” y ella lo trata como texto, nunca como código.

# ❌ Vulnerable — mete lo que escribió el usuario directamente
cursor.execute(f"SELECT * FROM usuarios WHERE nombre='{nombre}'")

# ✅ Seguro — el ? es un marcador, la base de datos nunca lo interpreta como código
cursor.execute("SELECT * FROM usuarios WHERE nombre=?", (nombre,))

Con esto, aunque alguien escriba ' OR '1'='1, la base de datos lo busca literalmente como nombre de usuario. No hay inyección posible.


// ¿te has atascado?

🔒

Ver solución paso a paso

Haz clic para revelar

  1. Escribe solo ' en el campo usuario. Si aparece un error SQL, es vulnerable.
  2. Escribe ' OR '1'='1' -- en usuario y cualquier cosa en contraseña. Envía.
  3. Si no funciona, prueba ' OR 1=1-- o ' OR 1=1#
  4. Al entrar verás el panel de administración con una flag y los datos de la base de datos.