Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - Veritabanı Attack
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

Veritabanı Attack

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: Veritabanı Attack
    Gönderim Zamanı: 24-08-2009 Saat 00:28

Web üzerinde kullanılan pek çok uygulama back-end olarak hizmet veren bir veritabanı kullanır. Bu sayede kullanıcıya interaktif bir oturum sağlanmış olur. Bu tip uygulamaların sıkça kullanıldığı alanlardan biri de formlardır. Kullanıcı ilgili forma kullanıcı ismini, şifresini, kredi kartı bilgilerini vs. yazar, daha sonra da “gönder” ya da “submit” tuşuna basarak kendi bilgilerini gönderir. Web sitesinde kullanılan ASP, PHP, JSP gibi uygulamalar, kullanıcının gönderdiği bilgileri alır ve kullanılan veritabanının türüne göre, uygun bir şekilde kodlayarak veritabanına gönderir.

 

Backend olarak kullanılan veritabanları da gelen istek karşısında, kullandığı tablolara bakar ve istenilen kriterleri sağlıyorsa onay verir. Veritabanlarından en çok kullanılanlar; Microsoft SQL ve Unix tabanlı sistemlerde kullanılan MySQL”dir. Özellikle MS SQL üzerinden yapılan saldırılarda kullanıcı bilgilerine ya da diğer bilgilere ulaşmak mümkündür. Bunun için biraz SQL mantığını bilmek yeterlidir. Şimdi olayın detayına inelim:

Hacker”ın ilk yapması gereken web sayfasında form kullanan bir site bulmaktır. Formlar, pek çok sitede kullanılan ve kullanıcıyla etkileşimi sağlayan elemanlardır. Bir html sayfasındaki tipik bir form şu şekilde kodlanır:

http://www.example.com/index.asp?userid=” or 1=1–

Bu ifade login kısmına da, şifre kısmına da, URL adresinin olduğu kısma da yazılabilir. Peki ama bu ifade ne anlama geliyor? Normalde kullanıcı ismi ya da şifre girmesi gereken yere, rastgele bir karakterin ardından ” or 1=1– yazılması, SQL dilinde kullanılan noktalama işaretleri ve lojik ifadeler yardımıyla login ekranını doğrudan geçmek ve normalde görünmeyen ekstra bilgilere ulaşmak içindir. Konuyu biraz daha açalım ve SQL veritabanında bir sorgulamanın nasıl yapıldığına bakalım. SQL”de tipik bir sorgulama şu formatta yapılır:

SELECT * FROM uyeler WHERE userID=”xxxuser”

Yukarıdaki deyim, “uyeler” tablosunda, kullanıcı ismi “ilyas” olan kişinin bütün ( * ) kayıtlarını görmek için kullanılır. Bu deyimde ilyas kelimesinin 2 yanındaki tek tırnağa dikkat edin. UserID kısmı zaten URL kısmında görüldüğünden, hacker bu bilgiyi kullanarak, girdiği bazı değerleri SQL”e enjekte edebilir. SQL enjeksiyonu olarak da bilinen bu olayda, hacker ” or 1=1– yazarak, giriş şartının kullanıcı isminin hiçbirşey olması ya da 1=1 eşitliğinin sağlanması gerektiğini SQL”e enjekte etmeye çalışmıştır. Bu yazdığı ifade SQL”e şöyle gider:

SELECT * FROM uyeler WHERE userID=” or 1=1–”

Deyimin sonundaki — ise SQL”e sorgunun sonundaki ek tırnaktan ( ” ) kurtulmak için geri kalan kısmı dikkate almamasını söyler. SQL sorgulamasında aşağıdakilerden herhangi biri kullanılabilir.

” or 1=1–
” or 1=1–
or 1=1–
” or “a”=”a
” or “a”=”a
“) or (”a”=”a

 

Şimdi aşama aşama hacker”ın nasıl sonuca gittiğine bakalım. Öncelikle yukarıda anlatılan noktalama işaretlerini kullanarak SQL”i ODBC hatası vermeye zorlayacaktır. Bu amaçla, iki veya daha fazla sorguyu
tek sonuç setinde veren UNION operatörünü kullanır. UNION operatörünün genel kullanımı şöyledir:

SELECT * FROM TABLO1 UNION SELECT * FROM TABLO2

Hacker ise UNION operatörünü şu şekilde kullanır:

http://www.example.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–

“INFORMATION_SCHEMA.TABLES”, sunucudaki tüm tablolar hakkında bilgi tutan bir sistem tablosudur. “TOP 1 TABLE_NAME” ise en üstteki tablodur. Hacker sistemde hangi tabloların olduğunu ve bunların isimlerinin ne olduğunu bilmediğinden, MS SQL”de standart olan genel isimleri kullanmıştır. Bu sorgulamada, veritabanındaki ilk tablo ekrana gelecektir. Ayrıca UNION operatörü sayesinde, bizim verdiğimiz string (nvarchar), 5 sayısına (integer) dönüştürülmeye çalışılacak, ama şu şekilde bir hata verecektir:

Microsoft OLE DB Provider for ODBC Drivers error “80040e07″

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value “tablo1″ to a column of data type int.

/index.asp, line 5

Hacker için bu mesaj çok değerlidir. Çünkü veritabanındaki ilk tablonun ismini öğrenmiştir: Tablo 1. Sıra diğer tablonun ismini öğrenmeye gelmiştir:

http://www.example.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (”tablo1″)–

 

alacağı cevap şu şekilde olacaktır:

Microsoft OLE DB Provider for ODBC Drivers error “80040e07″

[Microsoft][ODBC SQL Driver][SQL Server]Syntax error converting the nvarchar value “admin_login” to a column of data type int.

/index.asp, line 5

Hacker bir aşama daha katetmiştir, çünkü kullandığı LIKE operatörü ile içinde “login” olan tabloyu aratmış ve bulmuştur: “admin_login”. Şimdiki hedefi “admin_log on” tablosundaki sütunların isimlerini öğrenmektir:

http://www.example.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = “admin_login”–

SQL”in vereceği cevap şöyledir:

Microsoft OLE DB Provider for ODBC Drivers error “80040e07″

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value “login_id” to a column of data type int.

/index.asp, line 5

“admin_login” tablosunda ilk sütunun ismi, “login_id” olarak bulundu. Ancak bir sonraki sütunun ismini de bilmesi gerekir. Bunun için NOT IN operatörünü kullanacaktır:

http://www.example.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=”admin_login” WHERE COLUMN_NAME NOT IN (”login_id”)–

Bu sorguya SQL şöyle cevap verir:

Microsoft OLE DB Provider for ODBC Drivers error “80040e07″

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value “login_name” to a column of data type int.

/index.asp, line 5

“admin_name” bilgisini de ele geçirdi. Hacker, bundan sonra benzer komutları uygulayarak yönetici hesabını ele geçirebilir ya da kendisi için yeni bir yönetici hesabı açabilir.

Anlatılan bu yöntem dışında, hedef makinede saklanan SQL prosedürleriyle uzaktan komut çalıştırmak da mümkündür. MS SQL varsayılan olarak kurulduğunda, Windows”daki administrator erişimine karşılık gelen SYSTEM hesabıyla çalışır. Bu hesapla sunucuya bağlanıldığında “master..xp_cmdshell” gibi saklı prosedürler çalıştırılabilir.

Mesela;

“; exec master..xp_cmdshell “dir c:”–

Komutu kullanılarak, C: sürücüsündeki dosyaların görüntülenmesi sağlanabilir. En baştaki ; işareti SQL”e sorgulamayı bitirmesini ve geri kalan kısımda verdiği komutu çalıştırmasını söyler. Bu komutun SQL”deki tam karşılığı şöyledir:

SELECT * FROM tablo1 where catid=”giyim” ; EXEC master..xp_cmdshell “dir c: “–

Uzaktan komut çalıştırmak suretiyle kullanıcı ismi ve şifresi yanlış bile olsa, önemli belgeleri, herhangi bir dosyaya yazdırıp sonra da kendi makinesinde açtığı bir klasöre kopyalanmasını sağlayabilir.

Önlemler

Gereksiz Saklı Prosedürleri ve Kullanıcı Yetkilerini Kaldırın: Kullanmadığınız master..xp_cmdshell, xp_starmail, xp_sendmail gibi saklı prosedürleri kaldırın. Ayrıca bu prosedürler sayesinde komut kullanımına izin veren, varsayılan SYSTEM hesabı da kullanılmamalıdır.

Noktalama İşaretlerinin Kullanımını Filtreleyin: Kullanıcılardan, URL”den, cookie değerlerinden gelen noktalama işaretlerinin ( “, “”, #, ; ), girdi olarak alınmadan önce filtrelenmesi gerekir. Bunun için küçük ASP kodları yazılabilir.

Girdi Ayarlarını Düzenleyin: Web sitenizde kullandığınız formun bir alanına girdi olarak nümerik değerlerin girilmesi gerekiyor olabilir. Bu durumda buraya girilen her değerin nümerik olup olmadığı kontrol edilmelidir. Benzer şekilde en fazla 10 karakter girilmesi gereken bir alana, 11 karakterin girilememesi gerekir. Böylece olası bir SQL enjeksiyonu saldırısından ya da tampon bellek taşmasından korunmuş olursunuz.

 
Saygılar..


Düzenleyen megabros - 24-08-2009 Saat 00:28
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.141 Saniyede Yüklendi.