Inyección SQL para iniciar sesión cuando no hay un registro en la base de datos

4

Tengo una pregunta que resolver. Bueno, no hay registros de nombre de usuario y contraseña en la base de datos, por lo que no se puede iniciar sesión sin insertar ningún registro. ¿Hay alguna forma de explotar el siguiente código e insertar registros para que podamos iniciar sesión?

<?php   
        $con = mysqli_connect("localhost", "root", "pass", "database");
        $username = $_POST["username"];
        $password = $_POST["password"];
        $logged_in = false;
        $query = "SELECT * FROM users WHERE username='$username'";
        $result=mysqli_query($con, $query);
          if(mysqli_num_rows($result) === 1) {
                $row = mysqli_fetch_array($result);
                if($row["password"] === $password){ 
                       $logged_in = true;
                }

        if(!$logged_in)
                echo("Failed to login");
?>

He intentado lo siguiente  username = 'OR 1 = 1 LIMIT 1; INSERT INTO usuarios (nombre de usuario, contraseña) VALORES ('usuario', 'pasar') -  username = 'OR 1 = 1 LIMIT 1 -

También dime si hay alguna otra forma de explotar el código.

    
pregunta Sushant 21.07.2016 - 10:17
fuente

2 respuestas

8

Esto parece ser un caso de UNION SELECT en lugar de insertar sus propios registros. Lo que debe hacer es averiguar cuántas columnas se están seleccionando (por prueba y error ... SELECCIONE 1,2,3 ... n hasta que deje de recibir un error).

Después de eso, inyectas la consulta para que la primera parte devuelva falso (no se encontró un nombre de usuario). La parte difícil: Inyecta ' OR 1 = 0; UNION SELECT 'banana' AS username, '123456' AS password FROM users LIMIT 1;# en el campo de nombre de usuario, y en el campo de contraseña inyecte 123456 .

Básicamente, obliga a la consulta SQL a devolver cualquier contraseña que desee y, por lo tanto, omite sus condiciones :)

    
respondido por el Tom 21.07.2016 - 10:37
fuente
-1

Está permitiendo la entrada directa del usuario en la consulta, por lo que es inyectable por definición.

Use declaraciones parametrizadas preparadas (no debe confundirse con procedimientos almacenados) y filtre su entrada.

Aquí hay una hoja de trucos para el manejo seguro de consultas

Lo pondrá al día en la mitigación de la inyección de SQL.

enlace

Los procedimientos almacenados también ayudan de manera importante. Puede escribir y dimensionar fuertemente sus parámetros de entrada y, por lo general, son seguros porque están parametrizados internamente. Sin embargo con gran flexibilidad viene el peligro. Si creas consultas dinámicamente dentro de ellas, puedes meterte en problemas. También puede limitar los privilegios de usuario de la base de datos de una aplicación, en una aplicación de todos los procedimientos almacenados, para ejecutar solo, no seleccionar, actualizar, eliminar y / o otorgar (!).

Espero que esto haya ayudado!

    
respondido por el user356540 22.07.2016 - 06:04
fuente

Lea otras preguntas en las etiquetas