Seguridad en bases de datos para ataques SQL Injection

Seguridad en bases de datos para ataques SQL Injection
 

Proteger los datos de los usuarios en una base de datos es algo que puede dar muchos problemas a empresas y autónomos a la hora de proteger su aplicación o página web. Más aún cuando estos datos son realmente delicados y pertenecen a clientes. Los ataques de sql injection actualmente están más controlados que hace años, donde casi cualquier persona podía probar, y por arte de magia accedía a tus datos de una manera extremadamente sencilla y con pocos conocimientos.

En este post os vamos a enseñar un sencillo ejemplo de ataque de sql injection y que métodos se han ido utilizando. Así, si te animas a investigar, te darás cuenta de que todo esto se vuelve más complejo y grande. A día de hoy existen verdaderos profesionales para prevenir estos ataques, al igual que para realizarlos. Las formas y métodos de evitarlos en casi cualquier lenguaje de programación suelen variar, pero en esta ocasión nos vamos a centrar en php.

Los ataques SQL injection se realizan mediante los formularios o cajas de texto en la Web (poniendo comillas para modificar la consulta que haces a la base de datos). Actualmente son el segundo tipo de ataque más peligroso que sufren los sitios Web. En 2014 se dio a conocer el famoso caso de Sony Pictures, que sufrió un ataque de este tipo por parte de un grupo famoso de hackers, donde les robaron la información de mas de un millón de usuarios.

Ejemplo de Inyección sql en PHP

Un ataque típico de sql injection se puede realizar en el formulario donde introduces tu usuario y contraseña, ya que suele recibir la mayoría de ataques SQL. Por ejemplo, una persona metería su usuario (Jonathan) y su contraseña (1234) y la consulta que llegaría a la base de datos de forma simple seria esta (estamos poniendo un ejemplo con una consulta muy fácil y entendible)
SELECT * FROM `Usuariossecretos` WHERE `user`=’Jonathan’ AND `pass`=’1234′

Para que un atacante consiga su objetivo, debe de modificar la consulta anterior para llegar a los datos que desea obtener, algo típico sería en el campo contraseña meter el código de inyección SQL: “Or 1=1″ o “having 1=1″. Modificando así la consulta, las comillas romperían la consulta cambiándola y haciendo otra a su gusto, obteniendo los datos que quiere.
SELECT * FROM `Usuarios` WHERE `user`=’jose’ AND `pass`=‘12345’ OR ‘1’ = ‘1’ (como 1 siempre es igual a 1, lo dará por valido y podrá entrar u obtener todos los datos)

No sólo dentro de la página se pueden encontrar estas vulnerabilidades, por ejemplo muchas veces los datos se pasan por la url del navegador. En una dirección www.mipagina.com/usuarios.php?id=1, estamos pasando un dato de id, donde podemos añadir un trozo de cadena más como la que mencionamos en el ejemplo anterior, obteniendo los resultados deseados. Herramientas como SQLMap te ayudan a comprobar la seguridad de tu página Web ante los ataques en tu base de datos.

Seguridad en bases de datos

Ahora vamos a ver unos pequeños consejos para mejorar la seguridad de nuestra base de datos.

Lo más básico para proteger las entradas de texto es en el código de la Web, donde tenemos que modificar la parte donde recoge los datos. Para ello se puede crear una pequeña función para controlarlo mucho más fácil y aprovecharse de los métodos que ya nos facilitan los diferentes lenguajes de programación. Por ejemplo, php, tiene una función llamada “mysql_real_escape_string” que sirve para eliminar estas comillas o caracteres maliciosos cuando haces la consulta en la web:

$Consulta=mysql_query(“SELECT * FROM `Usuarios` WHERE `User`='”.mysql_real_escape_string($name).”‘ AND `pass`='”.mysql_real_escape_string($password).”‘”)

Básicamente se trata de pasar todos los campos de texto de la Web por un filtro. También es buena idea que se verifiquen los datos en los formularios. Por ejemplo, si un campo es de números, que sólo se pueda meter números. O si es un código postal, verificar la longitud de números que meten .

Otro método es PDO, que lo utilizamos para filtrar las consultas y evitar estos ataques, intentando evitar el escapado de variables. Un ejemplo de como quedaría el código.
$consulta = $pdo->prepare(“SELECT * FROM usuarios WHERE direccion = :direccion”);

seguridad en bases de datos

Las bases de datos SQL también tienen su sistema para protegerse de estos ataque. Aunque muchas veces según cómo tengamos la programación del código php resulta ineficaz, ya que la consulta le llega ya creada. Aún así, toda precaución es poca y por eso aconsejamos que en las consultas pongáis las comillas a la hora de validar los datos. Por ejemplo, como podemos ver en el ejemplo la palabra $idusuario. Visto sobre el papel seria algo así:

SELECT nombre FROM usuarios WHERE id_usuario = ‘$idusuario’

Realmente esto es una simple y corta explicación. Si os ponéis a investigar por tu cuenta encontraréis mil métodos de evitar estos ataques, por que se producen y como aplicarlos a tu programa o página web. Incluso en WordPress puedes encontrar plugins con los que defenderte de estas vulnerabilidades o infiltraciones en tu base de datos, añadiendo sencillos trozos de texto en tus consultas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Cargando…