¿Qué es la inyección SQL?

Publicado el en la categoría Bases de Datos, Diseño y Programación, General, Seguridad

SQL_InjectionLa inyección SQL es uno de los mecanismos de ataque más comunes a nivel de aplicación que aprovechan fallos en la programación y agujeros de seguridad para lograr acceso a la base de datos de una web y ejecutar cualquier comando SQL sobre la misma.

Hoy en día las páginas web suelen ir ligadas a una base de datos, la cual es central para el funcionamiento de la misma ya que guarda la mayoría de contenido de la misma así como la información necesaria para su funcionamiento, credenciales de acceso de los usuarios, datos privados de estos, información de pagos, estadísticas, etcétera. Toda esta información es mostrada, cambiada o borrada de forma controlada a través del interfaz, que es la propia web.

Y es la propia web el principal vector de ataque usado para inyectar SQL. Al igual que en los ataques XSS, una mala seguridad se traduce en que un atacante pueda introducir código malicioso. Este código puede realizar cualquier acción en la base de datos, por lo que el atacante puede, por ejemplo, lograr autentificarse como otro usuario sin conocer su contraseña, otorgarse permisos de administrador, manipular cualquier registro, obtener cualquier dato o borrar cualquier registro, incluso eliminar todas las tablas de la base de datos.

Vamos a ver un ejemplo de vulnerabilidad y ataque de inyección SQL. Tenemos un formulario de login en nuestra web y ejecutamos la siguiente consulta para comprobar los credenciales enviados:

SELECT * FROM usuarios WHERE nombre = '$usuario' AND password = '$password’

Si en el formulario ponemos como nombre=Juan y como contraseña=algo’ OR ‘x’ = ‘x’, la consulta quedaría así:

SELECT * FROM usuarios WHERE nombre = 'Juan' AND password = 'algo' OR 'x' = 'x'

La parte de la consulta ‘x’ = ‘x’ siempre será evaluada como verdadera, por lo que el atacante podría saltar la comprobación de login.

Evidentemente, una vulnerabilidad en nuestro código que permita la inyección SQL es un riesgo enorme. Para evitarlo, las técnicas varían según en qué lenguaje estemos programando. En el contexto web, lo más probable es que sea PHP.

En PHP, desde la versión 5.5 las funciones mysql_* están deprecated (anticuadas y en proceso de desaparición), y a partir de la versión 7 serán eliminadas, en favor del uso de las funciones mysqli o de PDO, siendo estas últimas las más recomendadas. Para evitar la inyección SQL en PHP, PDO permite usar la técnica de parametrización de consultas, con la cual los parámetros de la consulta son saneados de forma automática mediante la función bindParam() imposibilitando la inyección de código, además quedando mejor a nivel de claridad de código.

$stmt = $dbh->prepare("INSERT INTO usuarios (nombre, password) VALUES (:nombre, :password)");
$stmt->bindParam(':nombre', $nombre);
$stmt->bindParam(':password', $password);

En el caso de usar CMS como WordPress, Joomla!, etcétera, lo recomendable es mantenerlos siempre al día, tanto el propio CMS como sus plugins y themes, ya que los equipos que los desarrollan suelen parchearlos en cuanto son detectados.

Para aquellos que quieran aprender más y prevenir estos ataques, el OWASP (Open Web Application Security Project) cuenta con guías avanzadas para la prevención de la inyección SQL, además de otros tipos de agujeros de seguridad.

Facebooktwittergoogle_plus