Una vulnerabilidad SQL Injection en un sitio web es una de las vulnerabilidades mas peligrosas que hoy en día existen, esta permite a un atacante ejecutar comandos a una base de datos a través de un servidor web.
La causa de esta vulnerabilidad se origina en una pobre programación en la que el desarrollador de un sitio web olvido agregar validación en el lado del servidor para proteger contra ataques SQLi (SQL Injection).
Las vulnerabilidades SQLi permiten a un usuario malicioso realizar lo siguiente en un servidor web.
- Hacer consultas SQL a través de una sentencia select (con la cual por ejemplo pueden hacer un select de la tabla de usuarios y obtener todas las credenciales de ese sitio web).
- Saltarse la autenticación o Bypass Authentication (lo vamos a ver mas abajo).
- Ejecutar comandos de sistema en la base de datos para comprometer el Servidor Web.
- Ejecutar comandos Insert/Delete para manipular los registros de la base de datos.
Authentication Bypass
Cuando un usuario se autentica en un sitio web generalmente se le solicita un usuario y una clave, cuando este la ingresa y presiona el botón "Sign in" o "Ingresar" lo que sucede en el servidor es que se ejecuta una sentencia select a la base de datos parecida a la siguiente.
select * from users where username = 'usuario' and password = 'clave'
Si el registro existe en la base de datos esta devuelve un valor booleano True y entonces el usuario es autenticado.
Lo que hace un atacante es aprovecharse de este proceso pasar a la base de datos una sentencia select que siempre devuelve un valor True como la siguiente.
select * from users where username = 'usuario' or 1=1 -- and password = ''
Aquí or 1=1 siempre devolverá un valor True y el símbolo - le dice a la base de datos que ignore lo que sigue a continuación que en este caso es la clave de acceso.
Para ilustrar este proceso podemos usar un sitio vulnerable como Mutillidae y colocar la sentencia ' or 1=1 - en el campo del usuario y nada o cualquier cosa en el campo de la clave, tomar en cuenta que después de el simbolo - va un espacio como se muestra en la siguiente imagen.
Al presionar el botón LogIn veremos que autentica con el usuario admin sin ingresar ninguna clave.
En este caso se autentico con el usuario admin porque la sentencia ' or 1=1 - no especifica ningun usuario y lo que hace es tomar el primer usuario de la tabla de usuarios que en este caso es admin.
Si quieres usar un usuario en especifico la sentencia es usuario' or 1=1 - como se muestra en la imagen siguiente sin olvidar agregar el espacio al final del símbolo -