Año 7 • No. 272 • Junio 25 de 2007 Xalapa • Veracruz • México
Publicación Semanal


 Centrales

 General

 Reportaje

 Regiones

 Becas y  oportunidades


 Arte

 Deportes
 
 Contraportada


 Números  Anteriores


 Créditos

 

Tecno Tips
Proteger las aplicaciones de SQL Injection
Parte I

Guillermo Humberto Vera Amaro
gvera@uv.mx

En esta ocasión vamos a hablar un poco de algo que tiene que ver con problemas en las técnicas de programación cuando hacemos acceso a una base de datos por medio de un formulario Web (aunque esto también se utiliza en las aplicaciones de escritorio). En estos ejemplos consultaremos un servidor MSSQL Server donde los comentarios comienzan con doble guión (“—”) pero esto afecta otros SMBD también.

Los ataques de inyección SQL que tienen éxito permiten a los usuarios malintencionados ejecutar comandos en la base de datos de la aplicación utilizando los privilegios concedidos en el inicio de sesión de la aplicación. El problema es más grave si la aplicación utiliza una cuenta con privilegios aumentados para conectarse a la base de datos. Por ejemplo, si en el inicio de sesión de la aplicación se conceden privilegios para eliminar una base de datos, un intruso podría eliminarla en caso de no disponer de las medidas de seguridad oportunas.

Entre las vulnerabilidades habituales que hacen que el código de acceso a datos sea susceptible de ataques de inyección SQL se incluyen:

-Validación de entradas débil.
-Construcción dinámica de instrucciones SQL sin utilizar parámetros de tipo seguro.
-Uso de inicios de sesión en bases de datos con privilegios aumentados

Por ejemplo, el desarrollador realiza una búsqueda de la siguiente forma:

String sql = “SELECT isbn,nombre,editorial,edición FROM [libros] WHERE isbn='” + txtBusca.Text + “'”

Él espera que el usuario ingrese el isbn para devolver (usualmente en una tabla o Grid) las cuatro columnas del libro. Pero qué pasa si en lugar del isbn ingresamos:
' UNION SELECT id, name, '', 0 FROM sysobjects WHERE xtype ='U' --

La consulta que se envía a la base de datos es la siguiente:
SELECT isbn,nombre,editorial,edición FROM [libros] WHERE isbn='' UNION SELECT id, name, '', 0 FROM sysobjects WHERE xtype ='U' --'

Esto nos devolverá el id y el nombre de las tablas en la base de datos. Teniendo el id de la tabla (693577509 en este caso), podemos saber sus columnas:
' UNION SELECT id, name, '', 0 FROM syscolumns WHERE id='693577509' --

Y con esto, puedo obtener la lista de usuarios, sus contraseñas o cualquier otra información de la base de datos.

' UNION SELECT 0, login, pass, 0 FROM usuarios --

También podría crear o borrar tablas dependiendo de los permisos del usuario en la base de datos con:
' DROP TABLE usuarios --

En la siguiente entrega veremos cómo protegernos de estos ataques SQL.