He leído en alguna parte que, en los ataques de inyección SQL, los atacantes usan esas palabras clave en los puntos de entrada de la aplicación. ¿Cuál es el propósito de hacer esto?
He leído en alguna parte que, en los ataques de inyección SQL, los atacantes usan esas palabras clave en los puntos de entrada de la aplicación. ¿Cuál es el propósito de hacer esto?
El fragmento AND 1=0
siempre se evalúa como false
y, por lo tanto, la consulta siempre devuelve un conjunto vacío, por ejemplo. si el fragmento de SQL en la aplicación es
SELECT * FROM users WHERE username = '<placeholder>'
entonces puedo convertir esta consulta a
SELECT * FROM users WHERE username = 'admin' AND 1=0 --'
cuando se utiliza admin' AND 1=0 --
como valor para el marcador de posición.
Ahora puedo insertar una segunda instrucción que se ejecuta en lugar de la deseada, por ejemplo,
SELECT * FROM users WHERE username = 'admin' AND 1=0; TRUNCATE TABLE users; --'
Aquí vaciaré la tabla users
como ataque.
Otra cosa utilizada es OR 1=1
que siempre se evaluó como true
. Esto se usa para consultar una tabla completa y eliminar el lugar donde se produce completamente, por ejemplo,
SELECT * FROM users WHERE username = 'admin' OR 1=1 --'
Esto se logra usando admin' OR 1=1 --
como el marcador de posición en el ejemplo anterior.
En este caso, se devolverá la tabla completa users
.
1=0
siempre es falso, por lo que una cláusula que contenga AND 1=0
también será falsa. Esto, al igual que el siempre verdadero OR 1=1
, se puede usar para omitir las condiciones en una cláusula WHERE
.
La variante OR 1=1
es generalmente más útil (por ejemplo, SELECT username WHERE userid=173
para obtener su nombre de usuario se convierte en SELECT username WHERE userid=173 OR 1=1
para obtener cada nombre de usuario en el sistema), pero la variante AND 1=0
puede, por ejemplo, usarse para omitir un "es este usuario ya registrado" cheque.
Lea otras preguntas en las etiquetas attacks sql-injection mysql