sql injection, tu página esta en peligro

SQL Injection

Probablemente hallas escuchado el termino SQL Injection  o Inyección de SQL y es que es uno de los ataques más frecuentes a los sistemas informáticos en la actualidad. Pero que es exactamente SQL Inyección y cómo es que un Hacker puede aprovechar esta vulnerabilidad para atacar los sistemas. Pues estas preguntas las resolveremos en este artículo.

 

La inyección de código es el método por medio del cual es posible infiltrar código SQL a través de los parámetros que utilizan las aplicaciones para generar las consultas en el BackEnd. La inyección es posible debido a al descuido o la ignorancia a la hora de escribir el código, dejando vulnerable a la aplicación para recibir “parámetros” que en realidad son sentencias de SQL adicionales, que luego son ejecutadas en la base de datos si el conocimiento de los administradores del sistema.

 

Este tipo de ataques se da en aplicaciones que generan las instrucciones SQL al vuelo o cuando se concatenan los parámetros a una instrucción base sin las debidas precauciones. Pero para entender mejor como es que se da este tipo de ataques es necesario conocer la anatomía de una instrucción SQL, para lo cual veamos la siguiente imagen:

 

SQL injection - base

Las instrucciones SQL generadas al vuelo por lo general parten de instrucción Base la cuales es una instrucción casi terminada a la cual solo se le concatena en el WHERE el parámetro de filtrado. La instrucción SQL por lo general está definida en el BackEnd, mientras que el parámetro es establecido desde el FrontEnd, de tal manera que el usuario puede manipular este parámetro para enviar no solo el valor esperado, sino que además agrega instrucciones SQL adicionales que serán ejecutadas después de la instrucción Base. Veamos cómo sería una consulta clásica de un usuario de la base de datos por medio de su nombre:

 

SQL injection - base impl

 

En la imagen vemos en Azul lo que corresponde a la consulta base, esta sección por lo general es fija en el código y solo espera el parámetro para ser concatenado. Tras la concatenación se generaría una consulta completa para consultar a los usuarios que se llamen “oscar”. Hasta aquí todo bien, pero que pasaría si en lugar de mandar solo el parámetro “oscar” mandaran “oscar’; delete from users;”, tras concatenar este parámetro tendríamos el siguiente resultado:

Select * from users where name=oscar; delete from users;

Veamos que aquí ya tenemos dos instrucciones completas, por una parte, estamos realizando la consulta del usuario, pero en una segunda instrucción estamos borrando todos los usuarios, por lo tanto, el resultado sería catastrófico para la aplicación.

En este escenario analizamos un delete sobre la base de datos, pero se puede emplear para realizar consultas, insertar registros o actualizarlos. Algunos ejemplos pueden ser actualizar un usuario para darle más privilegios o insertar un nuevo usuario. Lo más importante de este ataque es que tenemos a nuestra merced absolutamente toda la base de datos, al menos hasta donde el usuario de la base de datos empleado para realizar las consultas no lo permite, de esta forma podríamos incluso limpiar todas las tablas o borrarlas.

 

Ejemplo de SQL Injection :

 

Para dejar mucho más claro cómo es que un hacker puede aprovecharse de esta vulnerabilidad para atacar un sistema informático, analizaremos un escenario muy común en las aplicaciones, el login o autenticación de usuario, el cual es un formulario muy simple como el que veremos a continuación:

 

sql injection login

 

En esta pantalla el usuario introduce su email y su password, presiona enter y la aplicación autentifica al usuario y le permite continuar en la aplicación, pero que pasa por dentro cuando presionamos el botón login.

Primero que nada, del lado del backend abra una instrucción base como la siguiente:

String statement = Select * from users where email = ‘“ + email + “’ and pwd= ‘“ + password +”’”;

Observemos que la instrucción base es un String el cual está esperando los valores de los parámetros para seguido ser ejecutada. En un caso normal un usuario escribiría su email y su correo, por ejemplo micorreo@gmail.com/1234 y esto generaría una instrucción SQL como esta:

Select * from users where email = micorreo@gmail.com and pwd = 1234

Se ejecutaría en la base de datos y nos retornaría los datos del usuario. Pero qué pasa si en lugar de mandar los parámetros esperado, agregara algo más, por ejemplo:  micorre@gmail.com/1234;delete from users where email like %

Veamos que el email es correcto, pero el password, además de tener un valor válido agrega un delete a la tabla de usuarios y tras realizar la concatenación tendríamos el siguiente resultado:

Select * from users where email = micorreo@gmail.com and pwd = 1234; delete from users where email like %

Lo que provocaría la consulta del usuario, seguido del borrado de todos los usuarios, colapsando todo el sistema.

 

Como prevenir un ataque de SQL Injection :

 

Básicamente existen dos formas de prevenir estos ataques los cuales nuestros a continuación:

Instrucciones SQL preparadas:

Esta técnica consiste en utilizar ayudas del API de nuestro lenguaje de programación para crear instrucciones SQL preparadas, las cuales ya tiene las instrucciones previamente definidas junto con los parámetros que pueden recibir, impidiendo que instrucciones adicionales puedan ser ejecutadas en Java se implementaría de la siguiente manera:

Escape de los parámetros:

Esta técnica consiste básicamente en convertir los caracteres especiales de SQL en simples String, para que de esta forma todos los parámetros sean interpretado como un solo String. Veamos un ejemplo en Java:

String sql = "select * from users where user = '" + user.replace("\\", "\\\\").replace("'", "\\'") + "';";

El resultado de este String será que todos los parámetros sea solo un String, de esta manera si se inyecta código SQL este solo será parte del where y no se ejecutara como una instrucción adicional.

 

Conclusiones:

La técnica de SQL Injection es de los ataques más utilizados en la actualidad y es que la gran mayoría de las aplicaciones que hoy están en funcionamiento son propensas a ser atacadas de esta manera, por lo que la mejor defensa contra este ataque es entender cómo funciona para poder prevenirlo.

Artículos relacionados

Single SingOn (SSO) El Single SingOn (SSO o inicio de sesión única) es la capacidad de las aplicaciones modernas para permitir a los usuarios el acceso a varias aplicacio...
Autenticación con JSON Web Tokens Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante...
Seguridad – Confidencialidad, Integridad y A... Cada día las aplicaciones tiene mayor necesidad de intercambiar mensajes con el fin de integrar aplicaciones o de comunicar algo a otras aplicacione...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

Deja un comentario

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