spacer.png, 0 kB
Bilgi için: bilgi at bilgiguvenligi gov tr   

 

spacer.png, 0 kB
spacer.png, 0 kB
Tek Kayıt Union SQL Enjeksiyonu Kullanılarak Veri Dökümü - Oracle Yazdır E-posta
Yusuf ÇERİ, TÜBİTAK-UEKAE   
20.03.2008

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:

  1.   Tablonun sutun sayısını bulmak

  2.   Tablonun sutun isimleri bulmak

  3.   Tablonun satır sayısını bulmak

  4.   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.

2008-02-13_091605-2.png

Ş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.

2008-02-13_092350.png

Ş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. 

2008-02-13_093844.png

Şekil 4 ACTOR tablosu içeriğin tümü

Şekil 5 ise seçilen 1. satırı göstermektedir.

2008-02-13_093527.png

Ş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

Bu yazıya ilk yorumu yazın

Sadece kayıtlı kullanıcılar yorum yazabilir.
Lütfen sisteme giriş yapın veya kayıt olun.

 
spacer.png, 0 kB
spacer.png, 0 kB
Copyright 2012 TÜBİTAK-BİLGEM. Sitenin teknik altyapısında Joomla kullanılmıştır. Yazar ve site referans gösterilmeden alıntı yapılamaz. Görüşleriniz
spacer.png, 0 kB