Forum Hafızoğlu

Tam Versiyon: SQL Enjection 1
Şu anda tam olmayan bir versiyonun içeriğine bakıyorsunuz. Tam versiyon'a bakınız.
S.A

arkadaşlar forumda adı çok geçen ama çoğu kişinin tam olarak bilmediği SQL enjeksiyonu hakkında bir kaç bölümden oluşan bir döküman hazırladım. Zamanım olduğu müddetçe geri kalanını yazacağım. Bu ilk kısmı... Devamı da inşallah gelecek. SQL enjeksiyonunu tam olarak öğrendiğinizde artık "phpnuke basit hack" olayına gerek kalmayacak



S1: SQL nedir? Niçin kullanılır?

C1: SQL bir veritabanıdır ve kullanıcıyla etkileşimi sağlayarak, istenilen bilgileri sorgulama türüne göre kullanıcıya sunar. Veritabanlarında tablolar saklanır ve bu tablolarda hakkında bilgi tutulmak istenen şeyler (üye,öğrenci, personel, ürün vs. kayıtları) bulunur. En çok kullanılan veritabanları Microsoft SQL ve Unix MySQL’dir.



S2: SQL’de sorgulama nasıl yapılır?

C2: Normalde veritabanının (SQL veya mySQL) kendi komutlarını kullanarak bir sorgulama yapabilirsiniz. Ancak SQL ya da MySQL kullanan bir siteye doğrudan sorgulama yapamazsınız. Sorgulama işi, bizim web sitesinde gördüğümüz sayfaları oluşturan asp ya da php kodları tarafından yapılır ve bu kodlar webmaster tarafından yazılır. Bir alışveriş sitesinden mesela ASUS marka notebook’ları göstermesini istediğimizde aslında bir sorgulama yapmış oluruz, ancak bu sorgulamayı bizim yerimize asp ya da php kodları yapar.



S3: SQL enjeksiyonu nedir?

C3: SQL enjeksiyonu, veritabanlarının kullanıldığı sitelere kod açıklarından faydalanarak yapılan komut girişleridir.Özellikle Asp ve php ile yapılmış ve kötü olarak tasarlanmış (kod açısından) sitelerde sıkça SQL enjeksiyonu açığına rastlanır.



S4: Her asp ya da php sitesinde bu açık varmıdır? Yoksa nasıl bulacağım bu açığı?

C4: Hayır, her asp ya da php sitesinde bu açık bulunmaz. Çünkü bu açığın temeli webmaster’un kodlarda yaptığı bazı hatalara dayanır.Her webmaster da bu açığa düşmez.Bu açığın bir sitede olup olmadığını öğrenmek için mesela asp ile yapılmış bir sitenin kullanıcı girişinin olduğu herhangi bir alana (kullanıcı ismi, arama alanı vs) ya da URL adresi kısmına ’ (tek tırnak) yazmanız yeterli. Bu sayede SQL’i hata vermeye zorlarsınız. Eğer şuna benzer bir ODBC hatası verirse, o siteye SQL enjeksiyonu yapılabilir:



Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’

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

/index.asp, line 11



S5: SQL’i başka nasıl hata vermeye zorlarım ?

C5: Şunlardan birini yazarak:

’ or 1=1--

" or 1=1--

’ or ’a’=’a

or 1=1--

Smiley (26) or (’a’=’a

" or "a"="a



S6: Peki bunları niçin yapıyoruz ve bunlar ne anlama geliyor?

C6: Bunları SQL’in normal kullanıcıya sunmadığı bilgileri önümüze sermesi için yapıyoruz. Bu sayede SQL hata veriyor ve biz de bu hatadaki bilgiler yardımıyla sisteme kod enjekte ediyoruz. Mesela ’ or 1=1-- şeklindeki bir ifadeyi kullanıcı girişinin olduğu herhangi bir alana yazdığımız zaman, SQL’e diyoruz ki: Giriş şartı ya hiçbirşeydir ya da 1=1 olduğu zaman geçerlidir. 1 her zaman 1’e eşit olduğuna göre, SQL bizim feykimiz yemiş oluyor, yukarıdaki gibi bir hata veriyor. Bu hata sayesinde biz de adını bilmediğimiz tablonun ne olduğunu öğreniyor ve ona göre yeni komut vererek amacımıza ulaşıyoruz.



S7: Olay biraz karıştı. Bir örnekle açıklasak şunu?

C7: Ok, SQL’de normalde bir sorgulama şu şekilde yapılır. MEsela bizim ürünler diye bir tablomuz olsun ve bu tabloda web sitesinde sattığımız kitaplarımız, telefonlarımız vb gibi ürünlerimiz olsun . Normalde SQL’deki "urunler" adlı bu tablodan "kitaplar" başlıklı tablonun hepsini seçmek istediğimizde şöyle çağırırız:



SELECT * FROM urunler WHERE urunID=’kitaplar’



Ancak biz bunun yerine şu ifadeyi kullanalım:



SELECT * FROM urunler WHERE urunID=’’ or 1=1--’



Şimdi en sağa dikkat edin, buraya ’ or 1=1--’ kod enjeksiyonu yaptık ve SQL’e "urunler tablosundan bana urunID’si boş olan (en baştaki tırnaklara dikkat edin) ya da 1=1 eşitliğinin sağlandığı tabloyu getir" dedik. Böylece adını hiç bilmediğimiz tabloların ismini öğrenmiş olacağız.