È SQL dove le query nell'autenticazione sono soggette agli attacchi temporali, se vengono restituite una o nessuna riga del database?

0

Supponiamo di avere questo codice per l'autenticazione.

   $me = mysql_query("SELECT * from users WHERE id='$_COOKIE[userid]' && password ='$_COOKIE[pass]'") or die (mysql_error());
   $me = mysql_fetch_array($me);

Per autenticare un utente su un sito web, qualcosa sul computer dell'utente deve corrispondere a ciò che si trova sul server (questa domanda non riguarda la prevenzione del furto dei cookie poiché tutti i siti possono essere rubati a prescindere), ma c'è un modo per usare sql dove controllare se si trova nel database senza che sia soggetto a un attacco di temporizzazione?

Cosa succede se qualcuno modifica i propri cookie su un ID utente e una password diversi per cercare di scoprire la password di qualcun altro utilizzando un attacco di temporizzazione? Se $me produce 0 risultati invece di 1 risultato, cambia il tempo medio necessario per eseguire la query?

Se sì, come dovrei cambiare il mio codice, perché non riesco a capirlo? Dovrei aggiungere un ritardo casuale al codice sopra, e fa una differenza mentre leggo non lo farebbe.

    
posta desbest 18.06.2017 - 18:54
fonte

2 risposte

1

Non preoccuparti di un attacco a tempo. La differenza tra 0 e 1 riga è minuscola.

Tuttavia, ci sono una serie di altri problemi con il codice che hai pubblicato:

  • Non consentire a un utente malintenzionato di inviare richieste sufficienti in modo da poter sfruttare una differenza di orario qui. Blocca le persone dopo un piccolo numero di tentativi di autenticazione falliti
  • $ _ COOKIE è interamente controllato dagli aggressori. Stai esponendo una vulnerabilità di SQL injection qui che qualsiasi pentester semi-professionale sarà in grado di sfruttare in pochi minuti
  • Non memorizzare MAI la password in testo semplice, ovunque. Non farlo nel tuo DB e di sicuro non salvarlo nel Cookie dove può facilmente diventare visibile al pubblico. Invece, memorizza un token permlogin per ogni utente che è interamente casuale (vedi CSPRNG) e grande (256 bit o più). Usalo per l'autenticazione basata su cookie
  • Utilizza un sale per le tue password. Selezionare il record utente per id e quindi confrontare le password. Così facendo diminuirai la superficie anche per un attacco di temporizzazione
risposta data 18.06.2017 - 19:30
fonte
0

Se vuoi essere sicuro, puoi farlo

'SELECT * FROM Users'

e quindi enumerare l'intero elenco nel codice controllando la password sull'intero elenco. Sarebbe vicino abbastanza tempo costante.

Il mio PHP è un po 'arrugginito ma qualcosa del tipo

$authUser = NULL;
$users = mysql_query("SELECT * from users");
$users = mysql_fetch_array($users);
foreach($users as $user){
    if ($user['id'] = $_COOKIE[userid]' && $user['password']='$_COOKIE[pass]'){
        $authUser = $user;
    }
}

if(is_null($authUser))
     // whatever

Tuttavia continuo a pensare che sia un errore memorizzare l'hash della password in un cookie. Significa che è impossibile revocare una sessione senza cambiare la password. Qualsiasi tipo di identificatore di sessione anche con una scadenza di 100 anni consente comunque di cancellare sessioni o modificare la scadenza senza cambiare la password

    
risposta data 18.06.2017 - 20:34
fonte

Leggi altre domande sui tag