lunes, 20 de junio de 2016

Inyección SQL



La inyección SQL es una técnica donde el atacante crea o altera comandos SQL existentes para exponer datos ocultos, sobrescribir los valiosos o ejecutar comandos peligrosos a nivel de sistema en el equipo que hospeda la base de datos.


¿Como se realiza una inyección SQL?
La inyección SQL se realiza mediante la práctica de tomar la entrada del usuario y combinarla con una consulta SQL.



Ejemplos de inyección SQL
Información previa para los ejemplos:
En los ejemplos expuestos a continuación, el texto de color verde representa la sentencia SQL original o lo que el programador espera que se ejecute, el texto de color azul es el dato, y el texto de color rojo, es el código SQL inyectado.

Primer ejemplo:
Acceder a un sistema vulnerable sin conocer su contraseña.


Código SQL original y vulnerable:


SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'


¿Como hacer para que la sentencia devuelva TRUE aunque no sepamos el password?


Si conocemos el nombre del usuario “hgarcia”  pero desconocemos el password y escribimos una contraseña al azar por ejemplo: “12345” la sentencia SQL  a ejecutar serás esta:


SELECT * FROM usuarios WHERE user = 'hgarcia' AND password='12345'


Como la contraseña no es válida, la sentencia devolverá false.  


Ahora..
Si un usuario astuto escribe como contraseña:  ' OR '1'='1 la sentencia SQL a ejecutar será:
SELECT * FROM usuarios WHERE user = 'hgarcia' AND password='' OR '1'='1'


Esta sentencia devolverá TRUE debido a que el usuario es correcto y aunque el password  de hgarcia no es igual a ‘’ (nada) se inyectó la condición OR con otra comparación que es ‘1’=’1’, como la condición OR solo requiere que una comparación sea correcta y ‘1’ es igual a ‘1’ la sentencia devolverá TRUE.


Segundo Ejemplo:
Eliminar una tabla a través de una consulta


Código SQL original y vulnerable:
consulta:= "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';"


¿Cómo utilizar esta consulta para eliminar una tabla de la Base de Datos?


Si el operador escribe cualquier nombre de usuario, por ejemplo: "Maria", la sentencia SQL a ejecutar será esta:
SELECT * FROM usuarios WHERE nombre = 'Maria';
Ahora...
Si un operador astuto escribe como nombre de usuario:
Maria'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE '%
La sentencia SQL a ejecutar será:
SELECT * FROM usuarios WHERE nombre = 'Maria';
DROP TABLE usuarios;
SELECT * FROM datos WHERE nombre LIKE '%';

En la base de datos se ejecutaría la consulta en el orden dado, se seleccionarían todos los registros con el nombre 'Maria', se borraría la tabla 'usuarios' y finalmente se seleccionará toda la tabla "datos", que no debería estar disponible para los usuarios web comunes.
Esta sentencia buscará todos los registros con el nombre de usuario ‘Maria’ pero además se borrará toda la tabla de usuarios y luego se seleccionan todos los registros de la tabla datos. Esta tercera instrucción se incrusta solo por el hecho que se requiere una instrucción para poder cerrar el último apóstrofe que tiene la sentencia SQL original.




No hay comentarios:

Publicar un comentario