Inyección SQL


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.

OWASP
Panel de login

Vamos a completar el login y interceptar esta solicitud con burp de esta manera:

Burp
Solicitud interceptada por Burp 


Ahora modificamos la solicitud en la parte que dice email y ponemos lo siguiente ' or 1=1-- de esta manera:

Burp
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:

Login owasp juice shop
Primer ingreso en OWASP Juice Shop a la cuenta del administrador


Pero la realidad es que normalmente nos vamos a dar cuenta en qué usuario estamos logueados porque lo podemos ver en la parte del perfil del sitio de esta manera: 

admin@juice-sh.op
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.

Exitos!

Redes:
Twitter: HackerEticoArg
Subreddit: r/HackArg