Explotación de la inyección SQL para saltarse la autenticación
En este laboratorio, profundizaremos en las vulnerabilidades de inyección SQL. Nuestro enfoque será en cómo explotar estas vulnerabilidades para eludir la autenticación de inicio de sesión, una técnica a menudo conocida como el ataque de la "contraseña universal".
Preparación del entorno de laboratorio
Para comenzar, necesitaremos preparar nuestro entorno de laboratorio. Utilizaremos la Damn Vulnerable Web Application (DVWA) - una aplicación web PHP/MySQL diseñada intencionalmente para ser insegura, lo que la convierte en una herramienta de aprendizaje ideal para comprender la seguridad de las aplicaciones web.
-
Descargar la imagen Docker de sqli-labs: La imagen Docker de sqli-labs está disponible para descargar en Docker Hub. Utiliza el siguiente comando en tu terminal para descargarla:
docker pull acgpiano/sqli-labs
-
Iniciar el contenedor Docker de sqli-labs: Después de descargar la imagen, ejecútala utilizando el siguiente comando:
docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs
Este comando inicia un nuevo contenedor y mapea el puerto 80 y 3306 del contenedor a los puertos 80 y 13306 de tu máquina host, respectivamente.
Siguiendo estos pasos, has configurado con éxito el entorno de laboratorio necesario.
Después de completar la configuración, abre Firefox y escribe http://localhost
en la barra de direcciones.
Si es la primera vez que visitas http://localhost
, haz clic en Setup/reset Database for lab
para preparar el laboratorio y luego actualiza la página web.
Identificación de la inyección SQL
Ahora deberías ver una página de inicio de sesión sencilla cuando hagas clic en Less-11. Intenta ingresar un nombre de usuario arbitrario 123
y una contraseña 123
.
La página de error te informará "Invalid username or password" (Nombre de usuario o contraseña no válidos).
Descifrado del código del backend
Examinemos el código del backend responsable del proceso de autenticación:
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
....
}
La consulta SQL real que se ejecuta es:
SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1
Esta consulta es fácil de entender: si devuelve una fila en la que tanto el username
como la password
coinciden, entonces el inicio de sesión es exitoso.
Explotación de la vulnerabilidad
Basándonos en el conocimiento del laboratorio anterior, intentemos ingresar la siguiente carga útil:
Nombre de usuario: 123' or 1=1 #
Contraseña: 123' or 1=1 #
Curiosamente, esto nos permite iniciar sesión con éxito. La razón es que la consulta SQL real que se ejecuta es:
SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'
En MySQL, el símbolo #
se utiliza para comentar el resto de la línea, por lo que la consulta se convierte efectivamente en:
SELECT * FROM users WHERE username='123' or 1=1
Dado que la condición or 1=1
es siempre verdadera, la consulta siempre devolverá un resultado, lo que lleva a un inicio de sesión exitoso.
También podemos experimentar con una variación que no utiliza el símbolo de comentario:
Nombre de usuario: 123' or '1'='1
Contraseña: 123' or '1'='1
La consulta SQL que se ejecuta entonces es:
SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'
En este caso, las dos condiciones or
aseguran que la condición and
entre ellas sea siempre verdadera, lo que lleva a un inicio de sesión exitoso.
Conclusión
Como se demostró anteriormente, hay numerosas técnicas que se pueden utilizar para explotar las vulnerabilidades de inyección SQL y saltarse la autenticación. Siéntete libre de explorar y experimentar con diferentes cargas útiles. El objetivo aquí es entender estas vulnerabilidades para que puedas proteger mejor tus propias aplicaciones de ellas. ¡Feliz hacking ético!