Questo modulo di accesso potrebbe essere "hackerato" per consentire l'accesso?

5

Abbiamo questo sito web legacy che contiene un codice orrendo. Ho appena esaminato il modulo di accesso / codice e posso vedere query sql non igienizzate. Per esempio. in poche parole:

$email=$_POST['email'];
$password = $_POST['password'];

$query = "SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='$email'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);

if($password == $row['password']){
    // set cookies and redirect user etc etc
}
else {
    // error not correct login details
}

La mia domanda è, mi rendo conto che ciò è negativo a causa dell'iniezione SQL. E conosco le basi di ciò. Ad esempio, potresti mettere '; DROP ALL TABLES; -- e ciò "causerebbe il caos".

Si può fare qualcosa di più "interessante" o "utile" (al potenziale hacker)? Posso esportare un elenco di password o scaricare le tabelle con questo? O potresti riuscire ad accedere come utente del sito, ad esempio se conosci solo il loro indirizzo email?

Soprattutto per interesse, ma anche per una migliore comprensione (e in questo sta trovando migliori approcci per la codifica).

    
posta Thomas Clayson 18.06.2012 - 14:43
fonte

2 risposte

5

Bene, con questo, puoi facilmente accedere con solo l'email, ecco perché:

La query predefinita è:

SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='$email';

Che significa, se:

$email = "[email protected]";
SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='[email protected]';

Ora, se lo faccio invece:

$email = "dontcare' UNION SELECT "mypass" AS password FROM users WHERE email='[email protected]' LIMIT 1, 1";
$pass = "mypass";
SELECT aes_decrypt(password, 'asdasdasd') AS password FROM users WHERE email='dontcare' UNION SELECT "mypass" AS password FROM users WHERE email='[email protected]' LIMIT 1, 1

Il tuo codice riceverà la seconda query, otterrai password che corrisponderà a "mypass", restituirà true, quindi mi autorizzerò per l'account [email protected] .

Ora, con "solo" il codice che ci hai mostrato, un utente malintenzionato non può visualizzare un'intera tabella, ma poiché l'autore del codice non si è occupato di proteggere l'input dell'utente, direi che se non lo è in quel pezzo di codice, c'è un'alta probabilità che sia ancora possibile qualche altro posto.

    
risposta data 18.06.2012 - 14:54
fonte
4

La risposta di cx42net è sbagliata. La funzione mysql_query () elabora solo una singola istruzione MySQL, quindi per eseguire un'iniezione SQL è necessario utilizzare UNION.

Il vero WTF è che se la query non restituisce righe e la password è vuota, l'utente viene autenticato come qualunque utente abbia presentato!

    
risposta data 18.06.2012 - 16:32
fonte

Leggi altre domande sui tag