Avec un compte privilégié (DBA ou les bons droits CREATE/EXECUTE), Oracle exécute des commandes du système d'exploitation en tant que son compte de service via plusieurs sous-systèmes. odat encapsule les trois ; choisissez celui que les privilèges du compte et la version de la base de données permettent.
Jobs externes DBMS_SCHEDULER#
Le scheduler peut exécuter un exécutable externe en tant que job. Il nécessite à la fois CREATE JOB et CREATE EXTERNAL JOB ; le privilège de job externe est ce qui permet effectivement à la commande OS de s'exécuter :
# ODAT splits the value on whitespace and does not support shell metacharacters (>, |, quotes),
# so point it at a plain executable or a pre-positioned wrapper script, not an inline one-liner
odat dbmsscheduler -s <target> -d <SID> -U user -P pass --exec "/tmp/run.sh"
Procédures stockées Java#
Lorsque Java est installé, une procédure stockée encapsulant Runtime.exec exécute des commandes dans la JVM de la base de données :
odat java -s <target> -d <SID> -U user -P pass --exec "id"
Préprocesseur de table externe#
Une table externe avec une directive de préprocesseur exécute un programme lorsque la table est lue, une voie qui fonctionne sans Java :
odat externaltable -s <target> -d <SID> -U user -P pass --exec "/path" "id"
# externaltable can also read host files with --getFile (case-sensitive); it has no write option
Notes d'exploitation#
- Les commandes s'exécutent en tant que compte de service Oracle (
oraclesous Linux, souvent un compte de service privilégié sous Windows), donc le gain est un accès à l'hôte en tant que ce compte. - Les trois points de sortie nécessitent des privilèges différents : choisissez en fonction de ce que l'énumération a montré (
CREATE JOBetCREATE EXTERNAL JOBpour le scheduler,CREATE PROCEDUREpour Java,CREATE ANY DIRECTORYpour les tables externes), et laissezodatles essayer tour à tour. - La voie des tables externes lit également les fichiers de l'hôte (
--getFile), utile lorsque vous avez seulement besoin de voler un fichier plutôt que d'exécuter une commande. - Une injection PL/SQL dans un paquet à droits
DEFINERpeut fournir le privilège manquant, transformant un compte faible en un compte qui atteint ces points de sortie.
Outils#
- ODAT (
dbmsscheduler,java,externaltable) : exécution de commandes automatisée sur les trois points de sortie. - sqlplus : exécutez le PL/SQL directement là où vous préférez le contrôle manuel.