Ho praticato materie relative alla sicurezza e questa sfida mi ha confuso. Nota: non posso accedere a nessun codice sorgente PHP, né posso modificarlo. Sono solo in grado di vederlo.
È indicato quanto segue:
- Ho due input, "user" e "pass"
- Dopo 30 volte il modulo viene inviato, il sale, gli hash e la soluzione finale cambiano. Quindi bruteforce non è un'opzione (purtroppo!)
- @ La parte inferiore della pagina (non mostrata nel codice per qualche motivo), echos che ha trovato
9 users(chiamando la funzione getnumberofusers ())
Sono riuscito a estrarlo:
username = root
password hash = 551e18b35e17017742a8ce4ed27f626e
Token (forse salt?) = 0St31ez14wOT6jTh
Quello che ho tentato finora con risultati non riusciti:
- Utilizzando SQL injection, seleziona una collisione MD5 nota come
passworde invia la sua controparte come "pass", tuttavia il sale sta disturbando questo processo. Chiaramente non potrei fare bruteforce perché dopo 30 tentativi il sale cambierebbe.- Ho provato a trovare l'intero elenco di utenti, ma non stampa l'output ovunque (solo errori)
Questo è il codice che riceviamo:
<?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;
}
?>
Qualsiasi aiuto è apprezzato e, se hai qualche domanda, mi piacerebbe chiarire la mia domanda!