Può ancora esserci un'iniezione SQL quando si memorizza la password come hash?

0

Potrebbe esserci una vulnerabilità di SQL injection nel codice qui sotto, poiché richiede solo query al database per nome utente e hash di bcrypt?

La vulnerabilità di questo codice sarebbe maggiore sull'algoritmo di hashing di bcrypt, sull'iniezione SQL o su entrambi?

Qualcuno può darmi qualche consiglio su come disinfettare il codice e spiegare come funziona l'algoritmo di bcrypt?

    <!Doctype html>
    <html>
    <head>
    <title>password validation</title></head>
    <body>


    <fieldset>
    <legend>enter password</legend>
    <form action =passval.php method = "post">
    <table>
     <tr>
    <td>Email:</td><td><input type="id" name ="id" /><br /></td>
    </tr>
    <tr>
    <td>Password:</td><td><input type = "password" name="password" />         <br /></td>
      </tr>
      </table>
      <input type = "submit" name ="submit" value ="insert" />
       </form>
         </fieldset>
         <br />


         <?php
     // connect to the server

      $conn = new mysqli('localhost', 'root', '', 'social');

      // check connection
    if(mysqli_connect_errno()) {
    exit("connection failed" . mysqli_connect_error());
     } else {
      echo "connection established";
      }




        if($_POST && isset($_POST['submit'], $_POST['password'], $_POST['id'])) {
         $pass = ($_POST["password"]);
      $id =($_POST["id"]);
      echo $pass;
    //$hash = $bcrypt->hash($pass['password']);
    $bcrypt = password_hash($pass, PASSWORD_BCRYPT, array('cost' => 12));
      $input = $pass;
      $query = "SELECT pass FROM social WHERE   email = '$id'";
       $result = $conn->query($query);

    while($row = mysqli_fetch_array($result)) 
    {
    //echo $row['pass'];
    //echo "<br />";
    echo "success";

   if (password_verify($input, $row['pass'])) {
    echo "matching pass" . header("Location: inserh.php");
   } else{
    echo "not a  mathch";
    }
    }
    }

    $conn->close();         // close the connection
    
posta nate35795 06.04.2016 - 07:27
fonte

1 risposta

6

È questa iniezione SQL?

Sì.

Perché?

Diamo un'occhiata a cosa sta succedendo qui.

$query = "SELECT pass FROM social WHERE   email = '$id'";

Questo passa $id direttamente alla query. Se $id non viene disinfettato, si verificherà l'iniezione SQL.

if($_POST && isset($_POST['submit'], $_POST['password'], $_POST['id'])) {
     $pass = ($_POST["password"]);
  $id =($_POST["id"]);
  echo $pass;

Quindi vediamo che $id non è sterilizzato quando viene assegnato il valore dell'indirizzo email fornito dall'utente. Quando questo $id viene passato alla query, l'autore dell'attacco può eseguire l'iniezione sulla query.

Ci sono altre vulnerabilità?

In realtà, la preoccupazione non è bcrypt, ma come gli utenti creano password e interagiscono con bcrypt. Assicurati di limitare la dimensione delle password a 4096. Ulteriori dettagli qui .

In secondo luogo, al momento, gli utenti possono eseguire XSS:

echo $pass;

Sebbene sia destinato a scopi di debug, fai attenzione a non lasciare dichiarazioni di debug quando sei pronto per implementare il tuo codice.

Va bene, ma come posso risolvere questo problema?

Domande parametrizzate.

Se questo è un progetto nuovo di zecca, raccomanderei l'uso di un ORM come Doctrine. Farà automaticamente query parametrizzate per te. Se ciò non funziona per le tue esigenze, utilizza almeno PDO, che supporta query parametrizzate anziché mysqli che non lo fa. Puoi leggere più qui .

Per ulteriori informazioni generali, OWASP è un buon posto dove andare per le vulnerabilità delle applicazioni Web: SQL Cheat Sheet di prevenzione dell'iniezione .

    
risposta data 06.04.2016 - 07:45
fonte

Leggi altre domande sui tag