La seguridad en las aplicaciones se torna cada vez más compleja, con la presencia de técnicas que van desde la ingeniería social hasta ataques DoS, pasando por la sencilla inyección de código SQL.

No se pueden imaginar la cantidad de aplicaciones que día a día crean los programadores con este fallo crítico ¿En qué consiste la inyección SQL? Es una técnica de hackeo con un funcionamiento bastante simple. Se basa en atacar aplicaciones cuyo formulario de inicio de sesión o cuadros de texto no se encuentran validados completamente o de la manera adecuada.

Paso a ilustrar un ejemplo, se necesita que se tengan nociones de SQL.

Supongamos que tenemos una aplicación construida en PHP y MySQL, pueden instalarlo localmente si tienen WampServer, la cual tiene una página de inicio de sesión: login.php.

Ahora bien, login.php tiene dos campos de texto, uno para el usuario y otro para la clave. El del usuario tendrá name user y el de la clave tendrá name pass.

Los name son campos que sirven para identificar los inputs y recuperarlos desde la página a la cual es enviada la acción. Supongamos que al iniciar sesión aqui seremos redirigidos a una página de tipo index.php. Aquí es donde suelen haber errores. Comúnmente lo que hacen las aplicaciones aquí es recuperar el código de ésta manera:

$usua = $_POST['user'];
$clav = $_POST['pass'];

Lo cual no tiene gran relevancia, si estamos usando un método POST en el formulario de login.php, pero lo que ocasiona el problema es el código que le sigue … éste:

$sql="SELECT * FROM usuarios WHERE user = '$usua' AND password='$clav'";

Lo que hace esa sentencia es verificar que existe el usuario mediante la devolución de un registro completo (y único en teoría). Por ejemplo, suponiendo que nuestro nombre de usuario sea Pepe y nuestra clave sea pepito123, entonces la cadena sql quedaría de ésta forma:

$sql="SELECT * FROM usuarios WHERE user = 'Pepe' AND password='pepito123'";

Aquí es donde entra la inyección SQL. No nos complicaremos mucho y comenzaremos con el clásico usuario vacío que valida todo y omitiremos la validación de clave. ¿Cómo? De la siguiente manera:

Usuario: ' or 1=1 --'
Clave: dsadsadas
 (da igual, escriban lo que sea, luego veremos por qué)

Al pasar estos valores por la cadena de validación SQL tendremos lo siguiente:

$sql="SELECT * FROM usuarios WHERE user = '' or 1=1 --'' AND password='dsadsadas'";

En MySQL un — es el inicio de un comentario, por lo que todo lo que se encuentra luego de éste par de caracteres no se ejecutará, por lo que solo nos quedará:

$sql="SELECT * FROM usuarios WHERE user = '' or 1=1 ";

Obviamente es improbable que se cumpla que exista nuestro usuario de login con nombre vacío (user = ''), sin embargo la segunda condición (1=1) siempre se cumple, por lo que podemos acceder a sistemas con bastante facilidad.

Evidentemente se exhiben cambios entre versiones de bases de datos y lenguajes de programación, por eso me tomé el trabajo de referirlos a un material bastante interesante que encontré en la web (enlace al final del post).

Esta hoja de referencia para inyección en SQL contiene códigos de guía para bases de dato Oracle, MySQL, SQL Server, PostgreSQL y lenguajes de programación como PHP, ASP, ASP.NET y Java, además de las diferentes combinaciones.

Se sorprenderán de la cantidad de aplicaciones que tienen vulnerabilidades que permiten inyección SQL en su formulario de login o inicio de sesión, ustedes no comentan los mismos errores.

El artículo que os mencionaba se encuentra en el siguiente enlace. ¡Espero que os sirva!

Fuente