SQL Injection en SQL Server

 

Como ya comentamos en el previo del artículo, los formularios sin validación se convierten en un fácil objetivo de ataque de SQL Injection. Vamos a comenzar por el principio.

¿Qué es SQL Injection?

SQL Injection (Inyección SQL) es una vulnerabilidad informática a nivel de base de datos de una aplicación. Esta vulnerabilidad se hace presente en el filtrado incorrecto de las variables utilizadas en partes del programa que usan sentencias SQL. De hecho más que vulnerabilidad es un error que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro.

Sin embargo la Inyección SQL no siempre surte efecto, ya que para ello, el sistema de base de datos debe de permitir la concatenación de consultas. Aunque existen maneras de realizar Injection sin concatenar consultas, estás suelen ser las más utilizadas.

Por defecto, sabemos que SQL Server permita dicha opción, y bases de datos como MySQL o Access, no están habilitadas por defecto, así que sabiendo esto una buena manera de evitarlo sería desactivar dicha opción.

Un ejemplo practico de SQL Injection

Un código que se repetirá en miles de sitios Web es el de validaciones de usuario con su correspondiente formulario de login. Este siempre ha sido un foco de ataque vulnerable para las aplicaciones mal protegidas. Ya que el programa se sirve de campos introducidos por el usuario para lograr la consulta SQL final que extraerá la información del usuario.

Por ejemplo, esta sería una consulta normal de extracción de datos para una validación:

"Select * From Usuarios Where usuario='" & Request.Form("usuario") & "' And password='" & Request.Form("password") & "';"

Esta sería una consulta normal y corriente donde se extraerían todos los datos del usuario y contraseña tecleado, pero que pasaría si el usuario consultante escribiese esto en los campos:

Usuario --> admin' Or true ''
Contraseña --> admin' Or true ''

Simplemente la cadena final quedaría así:

Select * From Usuarios Where usuario='admin' Or true '' And password='admin' Or true '';

¿Peligroso verdad?, esta cadena daría acceso al primer usuario de la base de datos o al usuario admin de la aplicación, ahora imaginemos que el sistema admite concatenación de consultas, el usuario podría emitir esta consulta tan solo escribiendo en el campo Contraseña del formulario:

Usuario --> admin
Contraseña --> admin'; Drop Table usuarios; Select * From articulos Where titulo like '%

El resultado final sería este:

Select * From Usuarios Where usuario='admin' And password='admin'; Drop Table usuarios; Select * From articulos Where titulo like '%'

Impresionante-mente desastrosos para nuestro sistema si no tenemos salvaguarda de nuestros datos.

¿Cómo puedo evitar estas técnicas?

Estas técnicas son más fáciles de evitar de lo que parece en un principio, con tener en cuenta un par de acciones ya dificultaremos en gran medida la inyección SQL. Aquí explicaremos la manera de evitarlo en ASP, cuando el formulario es devuelto, antes de pasar la instrucción, aplicamos un simple reemplazo.

Replace(Request.Form("usuario"), "'", "''")

Lo ideal es que creemos una función que nos reemplaza los caracteres no deseados, como podrían ser la comilla simple, el punto y coma, los guiones simples juntos (--), etc.

Otra técnica para asegurarnos un buen funcionamiento sin ataques es la de asignar los permisos correctos al usuario que manejará la base de datos en Internet, nunca asignéis permisos de eliminación a un usuario que tan solo tiene que hacer consultas, es un riesgo innecesario.

La técnica de SQL Injection no solo está vigente en formularios, hemos de recordar que también las URL pasan parámetros para que estos consulten la base de datos, una consulta como "default.asp?id=1" podría convertirse en el objetivo de ataque.