Buscador

Busca aquí los artículos:

 

RSS Suscríbete al Boletín

Escribe tu correo para recibir nuestro boletín de artículos:

Plan Correo

1 Dominio

150 Mb de correo electrónico

Web en HTML

Precio: 45 € / Año

Ir Plan Correo

Plan Iniciación

1 Dominio

3 Gb de Tráfico Mensual

2 Bases de datos MySql

250 Mb de espacio Web y Correo

Ilimitadas BD Access

Programación ASP, ASP.Net y PHP

Precio: 5 € / Mes

Ir Plan Inicial

Plan Básico

1 Dominio

8 Gb de Tráfico Mensual

10 Bases de datos MySql

600 Mb de espacio Web y Correo

Ilimitadas BD Access

Programación ASP, ASP.Net y PHP

Precio: 10 € / Mes

Ir Plan Básico

Plan Profesional

1 Dominio

20 Gb de Tráfico Mensual

30 Bases de datos MySql

1,5 Gb de espacio Web y Correo

Ilimitadas BD Access

Programación ASP, ASP.Net y PHP

Precio: 18 € / Mes

Ir a Plan Profesional

Plan Profesional ISP

50 Gb de Tráfico Mensual

50 Bases de datos MySql

4,5 Gb de espacio Web y Correo

Ilimitadas BD Access

Programación ASP, ASP.Net y PHP

Precio: 30 € / Mes

Ir a Plan Profesional ISP

Servidor Linux

Tu servidor dedicado con sistema Linux por 199 € al mes .

 

 

Ver más

Servidor Windows

Tu servidor dedicado con sistema Windows por 210 € al mes .

 

 

Ver más

Registre su dominio ahora

www.

Su dominio en 24 horas
Su propio nombre de dominio en un tiempo record, sin complicaciones ni compromisos.

SQL Injection en SQL Server

Feed RSS Estás en SQL Server Fecha: 07/05/2007

Muchos programadores no tienen en cuenta el potencial peligro que supone no validar las cadenas que el usuario nos envía a la Web, estas se pueden convertir en ataques que podrían arruinar nuestro sistema.
Publicidad

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.

 

Lecturas: 8849

Artículos Relacionados

Índices Utilizados e Inactivos en SQL Server

Fecha: 31/07/2007

Os enseñamos a buscar los índices que no se están utilizando en una base de datos SQL Server, esta tarea es importante para eliminar los índices obsoletos de las tablas.

Coincidencias de la Base de Datos

La sentencia Server.Execute en ASP

Fecha: 19/04/2007

Hay muchas maneras de programar una aplicación Web en ASP clásico, pero sin duda alguna la sentencia Server.Execute, nos puede dar una jugabilidad impresionante.

Comentarios de los Usuarios (2)

kpax escribió:

Fecha: 12/05/2007 12:02:11

No sabía que eso se pudiese hacer
No tenía ni idea de que alguien pudiese manipular las consultas SQL así, es un tema preocupante ya que no lo había tenido en cuenta en mi Web.

Me pondré ahora mismo a repararlo, por suerte mi Web no tiene demasiadas visitas y creo que nadie se ha dado cuenta, por lo menos no he detectado ningún ataque.

Jonaytom escribió:

Fecha: 11/01/2008 15:14:55

evitar injection desde formularios (php)
Para evitar injection, yo uso la siguiente función, espero que sea de utilidad:
function ValidarDatos($campo){
//Array con las posibles cadenas a utilizar por un hacker
$CadenasProhibidas = array("Content-Type:",
"MIME-Version:", //evita email injection
"Content-Transfer-Encoding:",
"Return-path:",
"Subject:",
"From:",
"Envelope-to:",
"To:",
"bcc:",
"cc:",
"UNION", // evita sql injection
"DELETE",
"DROP",
"SELECT",
"INSERT",
"UPDATE",
"CRERATE",
"TRUNCATE"
"ALTER",
"INTO",
"DISTINCT",
"GROUP BY",
"WHERE",
"RENAME",
"DEFINE",
"UNDEFINE",
"PROMPT",
"ACCEPT",
"VIEW",
"COUNT",
"HAVING",
"'",
'"',
"{",
"}",
"[",
"]",
"HOTMAIL", // evita introducir direcciones web
"WWW",
".COM",
"@",
"W W W",
". c o m",
"http://"
"$", //variables y comodines
"&",
"*"
);
//Comprobamos que entre los datos no se encuentre alguna de
//las cadenas del array. Si se encuentra alguna cadena se
//dirige a una página de Forbidden

foreach($CadenasProhibidas as $valor){
if(strpos(strtolower($campo), strtolower($valor)) !== false){
echo("");
exit;
}
}
}

//Asignamos la variable POST y llamada a la función Validardatos($texto)
$texto= $_POST["texto"];
ValidarDatos($texto);
?>

Este artículo ya ha superado la fecha máxima para escribir comentarios, 1 año.


Hosting y Alojamiento Web