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 ilustrarles un ejemplo, se necesita que 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. El formulario sería algo así:
Usuario: | |
Clave: | |
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 --'
(da igual, escriban lo que sea, luego veremos por qué)
Clave: dsadsadas
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. Yo mismo encontré problemas de este tipo en aplicaciones web de mi facultad como parte de un proyecto para mi curso de Seguridad Informática en la UNI.
Enlace: Ferruh