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
password
e 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!