Skip to main content

El viaje del cifrado perdido (300)

Descripción del desafío

En un rincón olvidado de la red, un antiguo servidor protege los secretos de un viajero legendario. La única manera de acceder a ellos es a través de un portal de login. Sin embargo, este portal es viejo y defectuoso, lo que te permite bypassar la seguridad si sabes cómo. Tu misión es explotar la vulnerabilidad para obtener el cifrado final y la bandera.

Una página de inicio de sesión titulada "La Cueva del Dragón" con un campo para introducir una contraseña

Análisis inicial

Siempre me gusta echar un vistazo al código fuente de las páginas web, ya que a menudo contienen pistas ocultas o comentarios interesantes. En este caso no hay nada, pero sí que podemos ver que la página es bastante simple, con un formulario que envía la contraseña al servidor.

Código fuente de la página de login
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>La Cueva del Dragón</title>
<style>
body { font-family: sans-serif; background-color: #f0f0f0; text-align: center; padding-top: 50px; }
.container { background-color: white; padding: 20px; border-radius: 8px; max-width: 400px; margin: auto; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
input[type="text"] { width: 90%; padding: 10px; margin-top: 10px; border: 1px solid #ccc; border-radius: 4px; }
input[type="submit"] { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; margin-top: 10px; }
.error { color: red; margin-top: 10px; }
</style>
</head>
<body>
<div class="container">
<h1>La Cueva del Dragón</h1>
<p>Un enorme dragón ha sellado su tesoro y solo el gran guerrero 'Aemond' conoce la contraseña para abrirla.</p>
<p>¿Serás capaz de entrar?</p>

<form action="/" method="post">
<input type="text" name="password" placeholder="Ingresa la contraseña secreta..." required>
<br>
<input type="submit" value="Entrar">
</form>


<p class="error">Contraseña incorrecta. ¡Solo &#39;Aemond&#39; puede entrar!</p>

</div>
</body>
</html>

Hipótesis sobre la vulnerabilidad

En este punto y con tan poca información, lo único que se me ocurre es que el formulario de login podría ser vulnerable a inyecciones SQL. Si no hace ningún tipo de sanitización de la entrada, podríamos intentar inyectar una consulta SQL para saltarnos la autenticación.

Supongo que el backend utiliza una consulta SQL similar a esta para verificar la contraseña:

SELECT * FROM users WHERE password = 'user_input';

Explotación de la vulnerabilidad

Podríamos intentar inyectar algo como ' OR '1'='1 para que la consulta siempre devuelva verdadero:

SELECT * FROM users WHERE password = '' OR '1'='1';

Efectivamente, al introducir esa cadena en el campo de contraseña, logramos acceder al tesoro del dragón.

Pantalla tras el inicio de sesión

La flag es:

ikerlan{sql_injection_is_magic}