SQL Injection no funciona cuando creo que debería

1

Estoy tratando de aprender sobre inyecciones de PHP y SQL, por lo que he creado un formulario de inicio de sesión donde los usuarios introducen su nombre de usuario y contraseña y hacen clic en el botón Iniciar sesión. Más adelante, en el servidor, obtengo los parámetros pasados usando la variable global $ _POST.

Este es el código utilizado para verificar si las credenciales de usuario son válidas:

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

$query = "SELECT * FROM User WHERE EMAIL='$email' AND PASSWORD='$password'";
$result = $mysqli->query($query);
$counter = mysqli_num_rows($result);

if($counter == 1)//Correct Login

El problema es que creo que si un usuario ingresa el siguiente texto en los campos de nombre de usuario y contraseña, el inicio de sesión debe hacerse (aunque no son valores válidos porque no existen en la base de datos).

Username: xxx' OR '1'='1/*
Password: */

Creo que sí, porque eso se traduciría a:

$query = "SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1/*' AND PASSWORD='*/'";

En otras palabras:

$query = "SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'";

Pero la inyección SQL no funciona, ¿por qué?

Mi DBMS es MySQL.

    
pregunta v8rs 07.07.2016 - 19:12
fuente

2 respuestas

6

No está funcionando debido a esto:

if($counter == 1)

El OR '1'='1' inyectado es válido para cada fila, y si hay varias filas en la tabla, esa verificación de $counter fallará.

Para evitar eso, podrías hacer algo como esto (si recuerdo mi SQL correctamente), con algo en $email y esto en $password :

' UNION SELECT * FROM User LIMIT 1 --

No se devolverá nada de la primera parte, pero la segunda mitad inyectada del UNION obtendrá una única fila arbitraria.

    
respondido por el Ben N 07.07.2016 - 19:25
fuente
2

Una forma más común y fácil de comentar para la inyección SQL es usar -- porque no tiene que cerrar el comentario. También requiere solo 1 entrada en lugar de 2.

En este caso, una inyección fácil se verá así:

Username : xxx' OR 1=1;--
Password : not that important

La consulta SQL será: %código%. Sin el comentario: SELECT * FROM User WHERE EMAIL='' OR 1=1;-- ' AND PASSWORD='not that important'

    
respondido por el Xavier59 07.07.2016 - 19:24
fuente

Lea otras preguntas en las etiquetas