Oracle Database a le dialecte le plus distinctif des grands moteurs, et plusieurs de ses particularités décident de la façon dont les payloads d'injection sont écrits.
Chaque SELECT a besoin d'un FROM, de sorte que les requêtes à une seule ligne sélectionnent FROM DUAL. Il n'y a pas de LIMIT ; la limitation de lignes est WHERE ROWNUM=1 ou FETCH FIRST n ROWS ONLY (12c et au-delà). Les chaînes se concatènent avec ||, et CHR() les construit sans guillemets. Les commentaires sont -- et /* */. Point crucial, Oracle ne prend pas en charge les requêtes empilées via les pilotes JDBC et OCI habituels : une seconde instruction séparée par ; ne s'exécute pas, de sorte que les actions multi-instructions nécessitent un bloc PL/SQL injectable à la place.
Le catalogue est constitué des vues ALL_/USER_/DBA_ (all_tables, all_tab_columns, all_users) et des vues de performance V$ (v$version, v$instance). L'identité et le contexte proviennent de SELECT user FROM dual et de SYS_CONTEXT('USERENV', ...).
Les primitives les plus puissantes d'Oracle vivent dans des paquets PL/SQL fournis, et depuis la 11g leur portée réseau (UTL_HTTP, UTL_INADDR, UTL_TCP, UTL_SMTP, HTTPURITYPE) est conditionnée par des listes de contrôle d'accès (ACL) fines, de sorte que le hors bande et certains canaux d'erreur dépendent d'une attribution d'ACL en plus du privilège execute sur le paquet. Indiquez ces conditions préalables quand un payload en dépend.
Techniques#
- Énumération : version, contexte de session et utilisateur courant.
- Contournement d'authentification : subvertir une connexion construite à partir des champs d'identifiants.
- Basée sur UNION : ajouter un
UNION SELECT ... FROM DUALavec des types correspondants. - Basée sur les erreurs : divulguer des valeurs via des erreurs ORA qui renvoient l'entrée.
- Aveugle : déduire des données à partir des différences de réponse booléennes.
- Basée sur le temps : déduire des données avec
DBMS_PIPE.RECEIVE_MESSAGE. - Escalade de privilèges : atteindre DBA via l'abus de rôles et de paquets.
- Injection PL/SQL : injecter dans les blocs anonymes et le SQL dynamique.
- Manipulation de fichiers : lire et écrire des fichiers avec
UTL_FILEet des objets directory. - Hors bande : exfiltrer via DNS et HTTP avec les paquets
UTL. - Abus de XML et XXE : abuser de l'analyse
XMLTypepour le SSRF et la lecture de fichiers. - Exécution de commandes : exécuter des commandes OS via Java ou
DBMS_SCHEDULER. - Énumération du listener et du SID : identifier l'instance et le SID.
- Persistance : tâches du planificateur, triggers et portes dérobées.
- Techniques d'évasion : commentaires,
CHR()et astuces de casse pour passer les filtres.
Outils#
- sqlmap : détection et exploitation automatisées (
--dbms=Oracle). - ghauri : alternative rapide avec une forte évasion de WAF.
- ODAT (Oracle Database Attacking Tool) : post-exploitation (abus de fichiers, de commandes et de privilèges).
- sqlplus (ou SQLcl) : le client Oracle pour une session directe une fois les identifiants récupérés.
Références#
- Oracle Database SQL Language Reference and PL/SQL Packages and Types Reference
- OWASP Testing Guide : Testing for SQL Injection