Voy a explicar cómo explotar una vulnerabilidad de inyección SQL. Una de las vulnerabilidades más comunes y la número uno en el top 10 de OWASP. Esta vulnerabilidad suele ocurrir cuando la entrada del usuario no se verifica o filtra y es interpretada directamente como un comando por la aplicación web.
Voy a explotar la máquina del OWASP Juice Shop en THM que es vulnerable a inyección SQL en el panel de login.
![]() |
Solicitud interceptada por Burp |
Ahora modificamos la solicitud en la parte que dice email y ponemos lo siguiente ' or 1=1-- de esta manera:
![]() |
Modificación de solicitud en Burp |
La declaración OR en SQL va a devolver Verdadero(True) si alguno de los dos lados es verdadero y 1=1 es siempre verdadero por lo cual el payload que insertamos anteriormente le va a decir al servidor que el email es válido y nos va a loguear al user id 0, que en este caso resulta ser la cuenta del administrador. Al ser un walkthrough educativo nos va a dar el siguiente mensaje:
![]() |
Primer ingreso en OWASP Juice Shop a la cuenta del administrador |
![]() |
Logueados en admin@juice-sh.op |
Esto sucede porque cada vez que intentamos loguearnos el sistema trata de verificar en la base de datos que la combinación de usuario/contraseña que insertamos sea la correcta. El problema es que en este caso no se valida de ninguna manera lo que pone el usuario por lo cual podemos directamente insertar comandos a la base de datos que está en el backend lo que nos permite hacer lo demostrado anteriormente. En el backend la solicitud normal para esto seria algo asi:
SELECT * FROM tabla_usuarios WHERE
username='Usuario' AND password='12345'
Pero con la declaración que hicimos nosotros quedaria algo asi:
SELECT * FROM tabla_usuarios WHERE
username='aa' or 1=1-- ' AND password='123'
En este caso el sistema solo interpreta hasta 1=1 y todo lo que está después de -- lo anula ya que en SQL el doble dash indica que empiezan los comentarios por lo que ' AND password='123' es interpretado como un comentario y no como una declaración, es por eso que el SQL intenta verificar si existe el usuario aa, lo cual es imposible porque es un campo de email, y luego pasa a verificar si la siguiente declaración es verdadera(1=1) lo cual genera que se seleccione el primer usuario disponible y permita al usuario autenticarse como tal.
Espero que les haya gustado esta pequeña guia y que los haya ayudado a entender un poco mejor de qué trata una inyección SQL.
Les queria comentar que hice el subreddit de r/HackArg para que también podamos ir ayudandonos entre todos, cualquiera puede participar y sería genial que puedan hacer sus aportes también.