SQLi 101 Lab : Login Panellerini Bypass Etmek
SQL Injection 101 Lab
1.Araç-Gereç
2.Kullanım Talimatları
3.Zayıflık İncelemesi
4.Login Bypassing
5.Ders Sonu Notları
Araç-Gereç
- Kodlar
- Apache Web Server Version 2.2.4
- PHP Script Language Version 5.2.3
- MySQL Database Version 5.0.45
- phpMyAdmin Database Manager Version 2.10.2 (Opsiyonel, sentaks hatası veren SQL query'lerin niçin hata verdiğini anlamak için kullanabilirsiniz.)
Kullanım Talimatları
- Kodları download edin.
- Arşivi açın (login.php, config.php, database.sql)
- config.php'deki veritabanı, kullanıcı adı, parola ayarlarını yapın.
- db.sql'i veritabanı sunucunuza import edin
- login .php'yi web sunucunuzdan çağırın
Zayıflık İncelemesi
Kodun, veritabanından kullanıcıyı doğruladığı kısmı :
$kullanici=$_POST["kullanici"];
$parola=$_POST["parola"];
$sql="SELECT * FROM users WHERE username='$kullanici' AND password = '$parola'";
$result=mysql_query($sql);
if (mysql_num_rows($result) != 0) { ..
Daha önceden herhangi bir denetim yapılmadığı için, bu kodun zaten zayıf olduğunu teorik kısımda söylemiştik.Peki bundan ne şekilde faydalınabilir?
Eğer; veritabanı sunucusuyla etkileşim için mysql_query() değil de farklı bir şey kullanmış olsadı, bu zayıflık sebebiyle aklınıza ne geliyorsa yapabilirdiniz.Basitçe kullanıcı adı yerine" '; " yazar; arkasına istediğiniz query'i ekler ve çalıştırırdık.Ama; mysql_query() fonksiyonu "multiple query"leri maalesef desteklemiyor ve bu da injection yapılmasını zorlaştırıyor. Neyse bu konuya ileriki bir derste tekrar döneceğiz.Tabi yanlış anlaşılmasın, bu MySQL'in değil fonksiyonun bir özelliği.
İşte bu kısıtlamadan dolayı, yapabileceklerimiz maalesef çok daha kısıtlı.Zaten onun için başlığımız "Login Bypass".Haricinde UNION sorguları çalıştırabiriz, fakat login.php dönen result set'lerini ekrana bastırmadığı için bize faydası olmaz.
Login Bypassing
Bu tip SQL Injection saldırılarında, atak genellikle iki aşamada gerçekleşir.Öncelikle gerekli sentaks tutturulmaya çalışılır, sonrasında da çalıştırabilecek query'lerin oluşturulmasına çalışılır.İkinci aşamada "cheat sheet" dediğimiz dökümanların bize hayli faydası olur.Öyle ki hiç SQL bilgisi olmayan biri bile açığın mantığını kapmışsa, cheat sheet'ler sayesinde etkili ataklar yapabilir.
Şimdi bu zayıflıktan faydalanarak bir kaç farklı şekilde login olunabilir.Login olabilmek için gerek ve yeter şart, boş result set dönememesidir.Geçerli SQL cumlesinde doğru kullanıcı adı parola girmeksizin boş result set döneceği açıktır , fakat sorgunun zayıflık sebebiyle manipüle edilerek her zaman dolu result set döndürmesi sağlanabilir.Bunun ' OR '1'='1 nasıl başarılabileceğini teorik kısımda açıklamıştık.Şimdi de farklı bir yolla nasıl yapılabileceğini anlatalım.
X:Veritabanında var olan bir kullanıcı
C:Comment, yani kendisinden sonra gelen ifadeyi veritabanı sunucusuna yorum olarak gösterip, query haricinde bir şeymiş gibi göstermeye yaran karakter.Netekim biraz programlama biliyorsanız ne demek istediğimi anlayacaksınız.
Örneğin ; kullanıcı adı yerine X' C formunda bir şey girerseniz, parolaya ne yazarsanız yazın login olabileceksiniz.
Çünkü:
SELECT * FROM users WHERE username='$kullanici' AND password = '$parola';
ifadesiyle hem girilen kullanıcı adı, hem de girilen parolayla uyuşan bir kayıt aranıyor. Fakat kullanıcı adına gireceğimiz Mesut' -- ibaresiyle elde edeceğimiz query :
SELECT * FROM users WHERE username='Mesut' -- ' AND password = '$parola';
Bunda da yoruma dahil olan kısmı silersek :
SELECT * FROM users WHERE username='Mesut'
halini alacak, SELECT ifadesinin ise result set olarak kullanıcı adı Mesut olan satırın tamamını döndüreceği anlamına geliyor.Yani girdiğiniz parola ne olursa olsun, commente dahil olacak, ve Mesut kullanıcısının bilgileri geri dönecek.Sonuç olarak, login olmuş olacaksınız. Bu arada bu injection'i gerçekleştirmeniz için illa ki kullanıcı adı olarak Mesut'u kullanmanız gerekmediğini herhalde anlamışsınızdır. Veritabanında kayıtlı her türlü isimle login olabilirsiniz, ve genellikle admin, root gibi daha fazla yetkiye sahip olması düşünülen kullanıcı adlarıyla login olmak daha makbuldür!
Haricinde,SQL'de #,/* gibi daha farklı yorum karakterleri de vardır, "--" yerine onları da kullanabilirsiniz.
Bu login aşamasını geçmenin OR'la ya da başka şekillerde de yolları vardır elbet ,SQL bilginiz iyiyse siz de düşünüp bulabilirsiniz.Lakin konu anlaşıldı sanıyorum, başka örnek vermeye gerek yok.
Ders Sonu Notları
Öncelikli olarak, verdiğim kodlarla birlikte bu uygulamayı kendi lab ortamınızda da denemeniz, ve veritabanında olmayan bir kullanıcı adıyla giriş yapmayı başarmanızı şiddetle tavsiye ediyorum.Aksi takdirde oturmayan şeyler olabilir, ve bu işleri öğrenmenin en iyi yolu denemektir.
Aslında Lab bölümlerinde, anlatımlardan sonra atakların daha iyi anlaşılması için video koyup, olayın nasıl gerçekleştiğini göstermek istiyordum.Bu bölüm için ilgili videoyu da çektim; fakat yazı bittikten sonra bu ders için videonun gereksiz olduğunu düşündüm, zira işin hiçbir zorluğu yok, tek yapmanız gereken 1-2 hane form doldurmak.
Haricinde her türlü eleştiri, yorum ,tavsiye ya da sorularınız için buraya comment yazabilir, ya da bana bir e-mail sallayabilirsiniz.