¿Puede seguir habiendo inyección SQL cuando se almacena la contraseña como un hash?

0

¿Podría haber alguna vulnerabilidad de inyección de SQL en el código a continuación, ya que solo solicita a la base de datos el nombre de usuario y el hash bcrypt?

¿La vulnerabilidad de este código sería mayor en el algoritmo de hash bcrypt, la inyección de SQL o ambos?

¿Alguien también me puede dar algunos consejos sobre cómo sanear el código y explicar cómo funciona el algoritmo de 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
    
pregunta nate35795 06.04.2016 - 07:27
fuente

1 respuesta

6

¿Es esta inyección SQL?

Sí.

¿Por qué?

Veamos lo que está pasando aquí.

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

Esto pasa $id directamente a la consulta. Si $id no está saneado, se producirá una inyección de SQL.

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

Así que aquí vemos que $id no está saneado cuando se le asigna el valor de la dirección de correo electrónico proporcionada por el usuario. Cuando este $id se pasa a la consulta, el atacante puede inyectar en la consulta.

¿Hay otras vulnerabilidades?

En realidad, la preocupación no es bcrypt, sino cómo los usuarios crean contraseñas e interactúan con bcrypt. Asegúrate de limitar el tamaño de las contraseñas a 4096. Detalles adicionales here .

En segundo lugar, actualmente, los usuarios pueden ejecutar XSS:

echo $pass;

Si bien esto está destinado a fines de depuración, tenga cuidado de no dejar declaraciones de depuración cuando esté listo para implementar su código.

Bien, pero ¿cómo soluciono esto?

Consultas parametrizadas.

Si este es un proyecto completamente nuevo, recomendaría usar un ORM como Doctrine. Hará automáticamente consultas parametrizadas para usted. Si eso no funciona para sus necesidades, al menos use PDO, que admite consultas parametrizadas en lugar de mysqli , que no lo hace. Puede leer más aquí .

Para obtener información más general, OWASP es un buen lugar para buscar vulnerabilidades de aplicaciones web: Hoja de trucos de prevención de inyección SQL .

    
respondido por el h4ckNinja 06.04.2016 - 07:45
fuente

Lea otras preguntas en las etiquetas