inyección SQL con AND 1 = 1

19

Por favor, explica el significado de " AND 1 = 1 " en un ataque de inyección SQL. Es de un ejercicio en mi universidad. Por ejemplo,

select * from user where id = 'smith'' AND 1=1;--  and birthdate = 1970;

o

select * from user where id = 'smith' and birthdate = 1970 AND 1=1;--;
    
pregunta Alex 08.11.2011 - 22:36
fuente

3 respuestas

33

La pregunta específica es la inyección de SQL con Y 1 = 1 y no O 1 = 1 . Hay una diferencia grande en lo que el OP está preguntando. Si yo fuera su profesor y usted me proporcionara la respuesta de JonathanMueller, obtendría una mala nota, ya que no comprende la pregunta.

AND 1 = 1 se usa usualmente en inyecciones SQL ciegas . Esto es cuando tienes que determinar entre un estado verdadero o falso a partir del resultado de la aplicación para establecer cuál es el resultado real. No se muestran los datos en el resultado, lo único que se devuelve es un estado de cambio.

Si intenta explotar una inyección de Blind SQL con OR 1 = 1 , fallará porque el uso principal de OR 1 = 1 es crear una declaración siempre verdadera para obtener la mayor cantidad de datos de la base de datos o forzar una declaración verdadera en el caso de que se explote un script de inicio de sesión.

Un ejemplo de exploit de SQL ciego:

  

Usamos nuestro ejemplo: enlace   Vamos a probarlo:    enlace y 1 = 1 < --- esto siempre es cierto y el   la página se carga normalmente, está bien.

     

enlace y 1 = 2 < --- esto es falso, así que si alguno   Falta texto, imagen o algún contenido en la página devuelta, entonces ese sitio es   vulnerable a la inyección de sql ciego.

Otro ejemplo en el que intentas descubrir la versión de MySQL:

  

enlace y subcadena (@@ versión, 1,1) = 4   Esto debería devolver TRUE si la versión de MySQL es 4. Reemplaza 4 por 5,   y si la consulta devuelve VERDADERO, la versión es 5.

Ejemplos tomados de: enlace

    
respondido por el Chris Dale 09.11.2011 - 18:17
fuente
15

Normalmente, la frase sería "OR 1 = 1 '". La razón es que si el programador no maneja correctamente los parámetros (como la identificación del usuario), un atacante podría usar un OR 1=1 para devolver todos los datos en la tabla.

Por ejemplo, supongamos que deseamos obtener detalles sobre un usuario llamado smith. La consulta podría ser select * from user where id = '?' , donde el signo de interrogación se reemplaza con un parámetro de la entrada de un usuario. Si el atacante pasó smith' OR 1=1-- , el SQL resultante sería select * from user where id = 'smith' OR 1=1--' . En este caso, la segunda cita única de la consulta original se omite porque forma parte de un comentario y la consulta devolverá todos los datos en la tabla de usuarios.

    
respondido por el JonathanMueller 08.11.2011 - 22:47
fuente
0

Para dar un ejemplo (un tanto trivial, fuera de la cabeza) de inyección de SQL, imagine esta consulta en algún lugar del código de su aplicación ...

select 1 from user where name='[NAME]' and password='[PASS]'

después de que Malicious Guy establece los parámetros nombrados arriba para su elección, obtienes:

select 1 from user where name='admin' --' and password='[PASS]'
using the following chosen, unsanitized values:
[NAME]=' --' and password='[PASS]'
value of [PASS] variable is unimportant

Por lo tanto, asumiendo que la consulta debe devolver 1 para el éxito y un conjunto vacío para el usuario o pase no válido, se devolverá un 1 erróneamente, permitiendo a este usuario malvado iniciar sesión como la cuenta de "administrador".

    
respondido por el Garrett 08.11.2011 - 23:26
fuente

Lea otras preguntas en las etiquetas