Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
Last updated
Last updated
Esta práctica de laboratorio contiene una vulnerabilidad en su función de verificación de existencias. Los resultados de la consulta se devuelven en la respuesta de la aplicación, por lo que puedo utilizar un ataque UNION para recuperar datos de otras tablas.
La base de datos contiene una users
tabla que contiene los nombres de usuario y contraseñas de los usuarios registrados. Para resolver la práctica de laboratorio, debo realizar un ataque de inyección SQL para recuperar las credenciales del usuario administrador y luego iniciar sesión en su cuenta.
Vamos a empezar probando por aqui, añadiendo un inyeccion SQL con UNION, pero evidentemente codificado ya y para eso usaremos hackvertor una extension de burp programa en JAVA.
En la aplicacion del laboratorio, entrando al detalle de cada producto si verificamos la existencia de cada producto, vemos una url interesante desde la utilidad de desarrolladores que muestra un XMLStockcheckPayload.js que al parecer codifica la solicitud HTTP que se hace al servidor, vamos a ver el codigo:
Vamos a probar diferentes comandos:
Aqui podemos ver como intentamos hacer una codificacion de URL pero no en su maximo esplendor, lo unico que codifica es el simbolo ‘ comilla simple y al parecer esto no es suficiente ya que la aplicacion cuando ingresamos la inyeccion al XML por medio del burp repeater, la app lo detecta como un ataque, esto debido a que la inyeccion no está lo suficientemente codificada como para pasar desapercibida por el servidor de backend, el WAF lo toma en cuenta.
Y aqui podemos apreciar como no podemos llevar a cabo la inyeccion ya que es detectada como un ataque, pero vamos a ver que pasa si codificamos toda el comando y comprobamos a ver si lo toma o no en cuenta.
%27%55%4E%49%4F%4E%20%53%45%4C%45%43%54%20%4E%55%4C%4C%2D%2D
EUREKA, efectivamente de esta forma el servidor lo interpreta como una consulta codificada por default por la misma aplicacion y no afecta devolviendo exitosamente un 200 OK, ya con esto podemos partir a empezar a modificar el ataque para acceder a los registros de users para la password de admin ya que hemos omitido con exito el WAF. (Web Application Firewall).
Hay algo aqui que no se habla y es que el “0 units” hace referencia a que no se devuelve más de una columna 0 es la posicion 0 de la columna 0 lo cual evoca un error, lo que tendremos que hacer será hacer una concatenacion de los atributos que deseamos obtener (username, password) dentro de la misma columna que se retorna para poder obtener los datos y que no nos devuelva un error, ¿listo? lo hacemos con el comando || ‘~’ || el OR son la concatenacion y lo que esta dentro de la comillas simples los separadores.
El comando lo tiramos sin las comillas simples, ya que es una inyeccion que se supone pasara directamente como una consulta directa al server, no estamos intentando adicionarlo en una consulta sino directamente por ese motivo creamos la consulta normal y luego la codificamos que es directamente para poder pasar por desapercibido.
Cabe aclarar que luego me di cuenta que la codificacion no era con encodeurl_all porque no me retornaba la informacion, luego intente con hex_entities y todo funciono de maravilla, de esa manera pude llevar a cabo el ataque, como esta en la imagen de abajo:
Listo ingresamos como admin al Lab para probar la autenticidad de la respuesta:
Enhorabuena, pudimos pasar el lab.
1 UNION SELECT ‘abc’, ‘def’— : este comando solo lo quiero probar que tanto puede aceptar la aplicacion ante otro tipo de consultas.
Respuesta: Retorna nada solo unit 0 y el 200 OK
1 UNION SELECT ‘abc’,NULL—
Respuesta: lo mismo, retorna la misma informacion, pero nada relevante.
1 UNION SELECT password WHERE username=’administrator’ FROM users—
Respuesta: tampoco dio resultado, no sirvió por más de que intente las codificaciones urlencode_all o hex_entities, ninguna sirvio, al parecer el comando que nos pudo agarrar fue el de mas arriba, estos comandos solo fueron con fines de probar más el laboratorio.
Si llegaste hasta acá gracias por leerme :)