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