|
Günümüzde web uygulamalarının karşı karşıya kaldığı en önemli web saldırı tekniklerinden birisi SQL enjeksiyonudur. Güvenli yazılım geliştirme bilgisi yeterli olmayan web geliştiriciler tarafından oluşturulan web siteleri/uygulamaları bu saldırı ile karşı karşıya kalacak ve normal bir kullanıcının ulaşamayacağı bilgiler, kolaylıkla ele geçirilebilecektir. Bu yazıda, SQL enjeksiyonuna açıklığı bulunan ve oracle veritabanını kullanan bir siteden, sadece veritabanındaki bir tablonun isminin bilinmesiyle neler yapılabileceği anlatılmaya çalışılmıştır.
Uygulamada ‘single union
output’ (Tek Kayıt Union) tipi SQL enjeksiyon açıklığı bulunduğunu
düşünelim. Tek Kayıt Union tipi SQL enjeksiyonu açıklığı
veritabanlarında yer alan bir tablonun aynı anda sadece bir satırındaki
verileri
alınabilmesine imkan tanımaktadır. Bu açıklık kullanılarak Oracle
veritabanında bulunan SYS.ALL_TAB_COLUMNS tablosu üzerinden sadece adı
bilinen bir tablonun satırlarını tek tek alabilmek mümkümdür. Bu
saldırı 4 adımda uygulanır:
-
Tablonun sutun sayısını bulmak
-
Tablonun sutun isimleri bulmak
-
Tablonun satır sayısını bulmak
-
Tablonun satırlarını tek tek almak
Örneğin, bilgi almak istenilen tablonun ismi ACTOR olsun. Aşağıdaki
bölümlerde ACTOR tablosunda bu dört adımın nasıl uygulandığı
anlatılmaktadır.
1. Tablodaki sütun sayısının bulunması
SYS.ALL_TAB_COLUMNS tablosu Oracle veritabanında bulunan tüm
tabloların bilgilerini tutan bir tablodur. Tablodan bilgi elde etmede
çıkış noktası olacaktır. Örneğin aşağıdaki SQL sorgusu
SYS.ALL_TAB_COLUMNS tablosundaki TABLE_NAME sütununda değeri ACTOR
olanların toplam sayısını verecektir.
select count(*) from SYS.ALL_TAB_COLUMNS WHERE TABLE_NAME='ACTOR'
Diğer bir deyişle bu değer ACTOR tablosundaki sütun sayısı
olacaktır. Şekil 1 örnek bir tablodan elde edilen sorgu sonucunu
göstermektedir.
Şekil 1 SYS.ALL_TAB_COLUMNS tablosunki ACTOR isimli tablo sütunları
2. Tablodaki sutun isimlerinin bulunması
Bu adımda aşağıdaki sorgu kullanılarak COLUMN_NAME sütunundaki değerler, satır numarası vererek alınır ve ACTOR
tablosunun sütun isimlerinin ve satır numaralarının bulunduğu bir tablo
oluşturulur. Böylece istenilen satırdaki sütun ismine ulaşılabilecektir.
select COLUMN_NAME from (select COLUMN_NAME, ROWNUM r
from SYS.ALL_TAB_COLUMNS WHERE TABLE_NAME='ACTOR') where r=1
Bu sorguda görüldüğü üzere iç içe sorgular gerçekleştirilmektedir.
İlk sorgu sonucunda ACTOR tablosunun sütün isimleri ve satır numaraları
seçilmekdir. Burada satır numarası tablonun bir değeri değil iken
veritabanı özellikleri kullanılarak eklenmilş böylelikle ikincil
sorgunun sadece birinci satırı getirmesi sağlanmıştır. Birinci sorgunun
sonucu Şekil 2'de gösterilmektedir. İkinci sorgu sadece ilk satırı
getirecektir.
Şekil 2 ACTOR Tablosu ve sütun isimleri
3. Tablodaki satır sayısını bulmak
İkinci adımda ACTOR Tablosundaki sütun isimleri teker teker elde
edildikten sonra, tablodaki satır sayısını bulunur. Aşağıdaki sorgu
ACTOR tablosundaki astır sayısını verimektedir. .
select count(*) from ACTOR
4. Tablonun satırlarını tek tek almak
Son aşamada elde edilen satır sayısınca satırlar teker teker alınır.Örneğin aşağıdaki sorgu 1. satırı getirmektedir.
select ACTOR_ID,FIRST_NAME,LAST_NAME from
(select ACTOR_ID, FIRST_NAME,LAST_NAME, ROWNUM r from ACTOR)
where r=1
Burada yine iç içe sorgular gerçekleştirilmektedir. Birinci SELECT
sorgusu ACTOR tablosundaki sütunlar ile satır numarasını ifade eden R
sütünunu içeren bir tablo oluşturur. İkinci sorguda R değeri
belirtilerek istenilen satırlara ulaşılabilmek mümkün olmaktadır. Şekil
4 ilk sorgu sonucunu göstermektedir.
Şekil 4 ACTOR tablosu içeriğin tümü
Şekil 5 ise seçilen 1. satırı göstermektedir.
Şekil 5 ACTOR tablosundaki bir satır
Sonuç
Bu makalede “single output union” SQL enjeksiyonu çeşidi kullanılarak
arka uçtaki Oracle veritabanından bilgilerin nasıl çekilebildiği
anlatılmıştır. Dikkat edilmesi gereken en önemli nokta web
geliştiricilerinin kullanıcıdan gelen her türlü parametreyi pozitif bir
şekilde kontrol ederek, sadece beklenilen girdileri kabul etmeleridir.
Referanslar:
1. http://www.securityfocus.com/infocus/1768
Favori olarak ekle (1) | Görüntüleme sayısı: 3293
Sadece kayıtlı kullanıcılar yorum yazabilir. Lütfen sisteme giriş yapın veya kayıt olun. |