He estado practicando temas relacionados con la seguridad y este desafío me ha confundido. Nota: No puedo acceder a ningún código fuente de PHP, ni puedo editarlo. Solo puedo verlo.
Se da lo siguiente:
- Tengo dos entradas, "usuario" y "pasar"
- Después de 30 veces se envía el formulario, la sal, los hashes y la solución final cambian. Así que la fuerza bruta no es una opción (¡por desgracia!)
- @ La parte inferior de la página (que no se muestra en el código por algún motivo), indica que encontró
9 users
(que llama a la función getnumberofusers ())
He logrado extraer esto:
nombre de usuario = raíz
contraseña de hash = 551e18b35e17017742a8ce4ed27f626e
Token (posiblemente sal?) = 0St31ez14wOT6jTh
Lo que he intentado hasta ahora con resultados fallidos:
- Usando la inyección SQL, seleccione una colisión MD5 conocida como
password
y envíe su contraparte como "pass
", sin embargo, la sal está incomodando este proceso. Claramente no pude forzar esto porque después de 30 intentos la sal cambiaría.- Intenté encontrar la lista completa de usuarios, pero no imprime la salida en ningún sitio (solo errores)
Este es el código que recibimos:
<?php
//by Mawekl
//Objective: login as root.
//Objective is NOT:
// - Blind SQLI
// - Bruteforce password/salt/id
#WARNING
#ANTI-BLIND
#for every 30 queries
#all hashes, salt
#and final solution
#will be reset.
function getnumberofusers()
{
$q = "SELECT 1 FROM 'sqlinjection1'";
$r = mysql_query($q);
return 'Number of users: ' . mysql_num_rows($r);
}
function getinfo($user)
{
$q = "SELECT 'id', 'password' FROM 'sqlinjection1' WHERE 'username'='$user'";
$r = mysql_query($q);
if(!$r)
return mysql_error();
$r = mysql_fetch_array($r);
if(!$r)
return "Username doesn't exists.";
return $r;
}
function getfullinfo($id)
{
$q = "SELECT * FROM 'sqlinjection1' WHERE 'id'=$id";
$r = mysql_query($q);
if(!$r)
return mysql_error();
$r = mysql_fetch_array($r);
if(!$r)
return "What the hell?!";
return $r;
}
function confirmpassword($pass, $passcorrect, $salt)
{
$pass = md5(md5(md5($pass)).$salt);
return $pass===$passcorrect;
}
function challenge($user, $pass)
{
$info = getinfo($user);
if(!is_array($info))
return $info;
$confirm = confirmpassword($pass, $info['password'], $_ENV['ST_SALT']);
if(!$confirm)
return 'Wrong password!';
$info = getfullinfo($info['id']);
if(!is_array($info))
return $info;
$returnmessage = "Welcome " . $info['username'] . "!" . PHP_EOL .
$info['welcomemessage'] . PHP_EOL;
return $returnmessage;
}
?>
Cualquier ayuda es apreciada, y si tiene alguna pregunta, me encantaría aclarar mi pregunta.