Oracle injection
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.
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,
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:
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:
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.
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.
İ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.
Ayrıca, şu gibi sorgularla basit bir port taraması yapmak için bunu da kullanabilirsiniz:
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;
Last updated