Authentication Bypass

Bu yazımızda web uygulamalarında kullanılan doğrulamaların nasıl bypass edilip aşılabilineceklerine değineceğiz.
Authentication Türkçe olarak doğrulama anlamına gelmektedir.Bir web sitesine girdiğinizde pek çok doğrulama alanıyla karşılaşırsınız.En basitinden örnek vermek gerekirse
bir forum düşünün foruma girip mesaj yazabilmeniz için


sizden üye olmanızı ve oturum açmanızı isteyecektir.Siz giriş bilgilerinizi yazdığınız vakit bunların sistemde bulunan verilerle eşleşip eşleşmediğini kontrol edecektir.Kontrol sonucunda da geriye değer döndürecektir.
Örnek bir senaryoyu inceleyelim.

Veri Girişi Yapılan Form

<form method="post" action="sql.php">
Kullanıcı adı: <input type="text" name="kullanici_adi">
Şifre: <input type="password" name="sifre">
<input type="submit" value="Giriş Yap">
</form>


öncelikle formumuzu inceleyelim.Nasıl işlediğine bakalım.method= ile gönderme metodu belirtilmiş.Get olursa url üzerinden parametreler gözükür ancak post olduğunda gözükmez.
Action kısmında bu verilerin gideceği dosya belirtilmiş.Yani butona basıldığında veriler sql.php dosyasına gidip sorgulancak.

sql.php Dosya İçeriği
<?php
$host = "localhost"; //veritabanı bilgilerimizi veriyoruz.
$kullanici = "root";
$sifre = "";
$veritabani = "deneme";

$mysqlbaglantisi = mysqli_connect($host, $kullanici, $sifre); //bağlantıyı kuruyoruz



mysqli_select_db($mysqlbaglantisi,$veritabani);          //veritabanımızı seçiyoruz
if (isset($_POST[’kullanici_adi’]) && isset($_POST[’sifre’])) {
   

$kullanici_adi=$_POST[’kullanici_adi’];
$kullanici_sifre=$_POST[’sifre’];
$kullanici_adi=mysql_real_escape_string($kullanici_adi);
$sqlsorgusu=mysqli_query($mysqlbaglantisi,"SELECT * FROM users WHERE username=’$kullanici_adi’ && password=’$kullanici_sifre’ ");
$donensonuc=mysqli_num_rows($sqlsorgusu); //veritabanı sorgusundan dönen sonuc sayısı tutuluyor.
if($donensonuc==0)
{
//Kullanıcı hatalı kullanıcı adı veya şifre girişi yaptığı için veriler veritabanındakiler ile eşleşmedi.
//Hatalı giriş için fonksiyonlar ve kodlar buraya
     echo "Kullanıcı adı veya şifre yanlış";
}
else
{
//Kullanıcının girdiği veriler veritabanı ile eşleşti.
//Doğru giriş anında çalışcak kodlar buraya
     echo "Girilen bilgiler doğru giriş yapıldı.";
}
}

?>



Görüldüğü üzere kullanıcının girdiği post datalar hiçbir filtreleme işleminden geçmeden direk olarak değişkenlere atanıyor ve daha sonrasında işleme sokuluyor.


Girişi denemek için rastgele veriler girelim.


Girilen veriler eşleşmediği için hata mesajı çıkardı.


Bu sefer verileri yukardaki gibi girelim.



Yukarda gördüğünüz gibi giriş başarıyla yapıldı çünkü artık sql sorgumuz aşağıdaki şeklini aldı.
$sqlsorgusu=mysqli_query($mysqlbaglantisi,"SELECT * FROM users WHERE username=’’ or ’x’=’x’ && password=’’ or ’x’=’x’ ");
Bu sorguda şunu söyledik username=’’ olanları yada ’x’=’x’ ve şifre boş olanları yada ’x=’x’ getir.Şimdi x her zaman x’e eşit olduğuna göre ve sorguları or(veya) bağlacıyla bağladığımızdan her durumda geri true yani doğru değer döndü ve giriş bypass edildi.


ÇÖZÜM:Gelen veriler filtrelenmelidir.Kullanıcı verileri mysql_real_escape_string ile filtrelediğiniz takdirde sorun çözülecektir.
$kullanici_adi=$_POST[’kullanici_adi’];
$kullanici_sifre=$_POST[’sifre’];
$kullanici_adi=mysql_real_escape_string($kullanici_adi);
$kullanici_sifre=mysql_real_escape_string($kullanici_sifre);
###########################################################


Parametre Değiştirerek Bypass

İSTEK >> http://siteadresi.com/admin/panel.php?yetki=0
Yetki Yok << CEVAP
İSTEK >> http://siteadresi.com/admin/panel.php?yetki=1
Yetki var giriş yapıldı. << CEVAP

Yukarda basit bir bypass örneği görülmektedir.
Ziyaretçi http://siteadresi.com/admin/panel.php adresine erişmek ister.
Sunucu gelen veriler içinde erişim doğrulama için oluşturulmuş kodu inceler.Parametrenin 0 verisine sahip olduğunu anlayınca isteği reddeder.
Durumu farkeden ziyaretçi parametredeki 0 yazan yeri 1 olarak değiştirir ve isteği tekrar yollar.
Sunucu gelen bilgilerde doğrulama bilgisinde 1 yazılı olduğu için gelen kişinin admin olduğunu sanar ve erişime izin verir.


###########################################################
Url Değiştirerek Bypass

http://siteadresi.com/admin/panel.php sayfasına erişim reddedilmektedir.Hedef kullanıcıda sayfa üzerinde oynamalar yaparak yansımalarını kontrol eder.
http://siteadresi.com/admin/panel.php?
http://siteadresi.com/admin/panel.php-
http://siteadresi.com/admin//panel.php gibi çeşitli eklemeler yaparak durumu test eder.Eğer kontrol yapısı basit bir şekilde salt url adresini kontrol ediyorsa sayfa bu şekilde aşılmış olacaktır.
###########################################################
Session Üzerinden Bypass
a)Basit Session Algoritması
Sayfalara erişimler session yani oturumlar üzerinden gerçekleşir.Yetki belirlemesi sesion üzerinden gerçekleşiyorsa ve session algoritması zayıfsa saldırgan tarafından yapılabilcek çeşitli denemeler sonucunda yönetici session(oturum) kimliği edinilebilir.Bu kimlik üzerinden sayfalara yetkisiz erişim gerçekleşebilir.
Basit bir SESSION ID Bilgisi Örnek Amaçlı:
07072014Admin >> Yönetici SESSION ID
07072014User >> Kullanıcı SESSION ID

b)Session Puzzling
Normal sayfaya erişim izniniz olmadığı bir durumda şifre sıfırlama sayfasına erişip şifre sıfırlama yaptığınızdaki oturum değişkeni ile sayfaya erişmek istediğinizde karşılaştırılan oturum değişkeni yapısı aynı ise bu şekilde de bypass edilebilir.
################################################################################################

Hakkımda Unknown

Turk DevilZ | Bug Researcher Expert


«
Sonraki
Sonraki Kayıt
»
Önceki
Önceki Kayıt

Hiç yorum yok:

Yorumlar