Neler Yeni

Web Güvenlik Açıkları

Katılım
22 Nis 2020
Mesajlar
86
Tepkime puanı
23
Puanları
150


# SQL Injection

# Cross Site Scripting (Siteler Arası Komut Dosyası)

# Broken Authentication and Session Management (Kırık Kimlik Doğrulama ve Oturum Yönetimi)

# Insecure Direct Object References (Güvensiz Doğrudan Nesne Referansları)

# Cross Site Request Forgery ( Siteler Arası İstek Sahteciliği)

# Security Misconfiguration (Güvenlik yanlış yapılandırma)

# Insecure Cryptographic Storage (Güvensiz Şifreleme Depolaması)

# Failure to restrict URL Access (URL Erişimini kısıtlama hatası)

# Insufficient Transport Layer Protection (Yetersiz Taşıma Katmanı Koruması)

# Unvalidated Redirects and Forwards (Doğrulanmamış Yönlendirmeler ve Yönlendirmeler)


SQL Injection

images.jpg


Açıklama

Enjeksiyon, bir saldırganın , kullanıcı tarafından sağlanan verileri işleyerek SQL ifadelerini arka uç olarak değiştirmesine izin veren bir güvenlik açığıdır .

Enjeksiyon, kullanıcı girişi bir tercümana komutun veya sorgunun bir parçası olarak gönderildiğinde ve tercümanı istenmeyen komutları çalıştırmak için kandırıp yetkisiz verilere erişim sağladığında gerçekleşir.

Web uygulaması tarafından çalıştırıldığında arka uç veritabanını da gösterebilen SQL komutu.

Implication ( İma)

#Saldırgan, savunmasız alanlara kötü amaçlı içerik enjekte edebilir.

#Kullanıcı Adları, Şifreler, vb. Gibi hassas veriler veritabanından okunabilir.

#Veri tabanı verileri değiştirilebilir (Ekle / Güncelle / Sil).

# Yönetim İşlemleri veritabanında yürütülebilir.


Hassas Nesneler

#Giriş Alanları

#URL ile veritabanıyla etkileşime giriyor.


Örnekler:

DH Academy de örneği mevcuttur.

# Giriş Sayfasına SQL enjeksiyonu

images-1.jpg


Önlemler ;

SQL injection yapmak korunmak çoğu zaman basit bir işlemdir fakat önemli bir konudur. Şimdi basit SQL injection yapmayı sonra farklı korunma yöntemlerini inceleyelim.

SQL injection kötü amaçlı, normalde çalışmaması gereken SQL komutlarıdır. SQL injection ya adres satırından ya da input alanından yapılır. Kötü amaçlı SQL kodu eğer veriler POST ile yollanıyorsa input alanına (genellikle text kutusuna), GET metodu ile yollanıyorsa adres satırına girilir.

SQL injection konusunua kısaca değindikten sonra şimdi SQL injection korunma yöntemlerini inceleyelim. SQL injection yapmaktansa bundan korunmak daha önemlidir.

SQL injection‘dan kurtulmanın bir çok yolu var. Bunları listeleyip daha sonra inceleyelim.
Genel SQL injection korunma yöntemleri:

# GET ya da POST ile yollanan verileri doğrulamak.

#Gönderilen verileri filtrelemek.

#SQL Parametresi kullanmak (Prepare yapmak)

#Kullanıcı yetkilerini kısıtlamak.

#Güvenliği test etmek, gözden geçirmek, önemli verileri encrypt etmek.

Şimdi bunları inceleyelim:

SQL injection kurunma yöntemi 1: GET ya da POST ile yollanan verileri doğrulamak

Doğrulama yapmak basittir. Örnekle aşağıdaki tablodaki karakteri içeren her hangi bir input alanı varsa kullanıcıyı uyarar tekrer veriyi girmesini sağlanabilir. Sakıncalı karakterler:


Sakıncalı karakterler

Bununla ilgili basit bir örnek yapalım. Aşağıdaki PHP kodu girdiyi Regular Expressions ile doğruluyor. Doğrularsa "doğrulandı" diye ekrana yazdırıyor. PHP ile girdi doğrulama kodumuz:


// Girdiyi alıyoruz.
//( örnek olduğu için girdiyi elle giriyoruz)
$input="Bu girdi kontrol edilecek..‘";
// Regular expression ile girdi kontrol (doğrulanıyor) ediliyor.
if (preg_match("/[\\\\\\\\\\\\\\\\-]{2,}|[;]|[‘]|[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*]/", $input))
echo "zararlı karakterler var";
else
echo "doğrulandı";


Yukarıdaki kodda input değerimiz içinde dikkatle bakarsanız ‘ tek tırnak ayıracı bulunuyor. By yüzden bu girdi doğrulanmayacaktır.

SQL injection yapmak için kullanılan özel karakterleri daha sorgu çalıştırılmadan girdiyi yukarıdaki örneğe benzer şekilde doğrulayıp soruyu çalıştırabiliriz.
Aynı doğrulama yöntemini ASP.NET‘de de Regular Expressions ile yapabiliriz.

SQL injection kurunma yöntemi 2: Gönderilen verileri filtrelemek

Seviyeyi biraz daha arttırıp istediğimiz karakterler dışındaki karakterleri filtreleyebiliriz. Bunu yine Regular Expresions kullanarak yapalım. Örnek PHP kodumuz:



// Girdiyi alıyoruz.
//(örnek olduğu için girdiyi elle giriyoruz)
$input="34‘; DELETE FROM test";
// Regular expression ile girdiyi filtreliyoruz
// 0 ve 9 arasında olmayan tüm karakterleri siler
$input=preg_replace("#[^0-9]#",‘‘, $input);
// aşağıdaki satır ekrana 34 yazdırır
echo $input;



Bu örneğimizde filtreleme yaparak direk olarak SQL injection koruması yapmış olduk.

SQL injection kurunma yöntemi 3: SQL Parametresi kullanmak (Prepare yapmak)

Prepere işlemini hep programlama diliyle hem de Mysql gibi veritanabanlarında yapmak mümkün.Biz örneklerimizde programlama ile yapacağız. Prepare ile sorgularımızı parametre alacak şekilde hazırlıyoruz daha sonra parametreleri bağlayayıp sorguyu çalıştırıyoruz. Bu yöntem bana göre en çok kullanılması gereken yöntemdir. Prepare işlemleri özellikle birden çok paramatre alan sorgular için daha uygun. PHP ile Prepare yapalım. Örekte PHP 5.1+ ile yüklü gelen PHP Data Objects (PDO) extension‘ı kullandık.


// Girdiyi alıyoruz.
//(örnek olduğu için girdiyi elle giriyoruz)
$input=1;
// veritabanına bağlanıyoruz (PDO : PHP Data Objects (PDO) extension )
// PDO extension PHP 5.1 ile otomatik olarak yüklü olarak geliyor.
$dbh = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
// prepare işlemi yapıyoruz
$stmt = $dbh - gt;prepare(‘SELECT * FROM people WHERE id = :id‘);
// bind işlemiyle verimizi bağlıyoruz
$stmt- gt;bindParam(‘:id‘, $input);

// çalıştırmayı deneyip hata almazsak çıktıyı gösteriyoruz
if ($stmt- gt;execute()) {
while ($row = $stmt- gt;fetch()) {
echo " lt;pre gt;";
print_r($row);
nbsp; nbsp; nbsp; nbsp; nbsp;echo " lt;/pre gt;";
}
}



PHP ortamında çalışıyorsanız Prepare ve Execute yapmanızı sağlayan ücretsiz dağıtılan farklı paketler mevcut. Bunlardan birisi PEAR Package‘dır. pear package (prepare işlemleri yapabilirsiniz kururak) (sql injection ve korunmak) linkinden indirebilirsiniz.

Eğer ASP.NET ortamında çalışıyorsanız aşağıdaki gibi prepare ve execute işlemlerini yaparak sql injection korunması sağlayabilirsiniz.


// id numarasını GET metodu ile alıyoruz string id = Request.QueryString("id"); // SQLcommand nesnesi oluşturuyoruz SqlCommand cmd = new SqlCommand("SELECT * FROM people WHERE id = @p_id"); // parametre tipini belirliyoruz var param = new SqlParameter("p_id", SqlDbType.Int); //parametre değerini giriyoruz param.Value = 1; // parametreyi bağlıyoruz cmd.Parameters.Add(param)

Yukarıdaki komut güvenle çalıştırılabilinir.

Prepare işlemlerini buna benzer şekilde kullanarak SQL injection korunması sağlayabilirsiniz. Her ne kadar Prepare işlemleri PHP ve ASP.NET ortamında farklı olsada aynı mantığı uygulayabilirsiniz. Bu arada Stored Procedures kullanarak Prepare yaparsanız en güzel SQL injection korumasını yapmış olursunuz.

SQL injection kurunma yöntemi 4: Kullanıcı yetkilerini kısıtlamak

Bu yöntem diğer yöntemlerden biraz farklı. Sadece kullanıcının SELECT, UPDATE, INSERT, CREATE vb. yetkileri elinden alarak korunma sağlanmış olur. En mantıklısı eğer INSERT, UPDATE gibi DML (Data Manipulation Language ; veri değiştirme dili) kullanılmıyorsa kullancıyı sadece SELECT ile kısıtlandırmak güzel bir çözüm olacaktır.

SQL injection kurunma yöntemi 5: Güvenliği test etmek, gözden geçirmek, önemli verileri encrypt etmek

Yapılan SQL injection korunma yöntemlerini sağladıktan sonra kendi sisteminize ilk başta kendiniz sızmalısınız. Şüphe duymalısınız. Kullandığınız yöntemlere güvenmemelisiniz.
Hiçbir zaman yüzde yüz güvenli bir ortam olmadığını düşünecek olursanız güvenliği her zaman elden bırakmamak gerekir. Zira farkında olunmadan bir açık bırakılırsa neler olacağı belli olmaz.

Şifreler, Kredi Kardı gibi önemli verilerin saf hali değil md5 gibi algoritmalar kullanarak encrypt edilip veritabanına girilmelidir.


Siteler Arası Komut Dosyası (XSS)

XSS_web-for-penterster-solution.png


Açıklama

Siteler Arası Komut Dosyası oluşturma, kısa zamanda XSS olarak da bilinir.

images.png


XSS açıkları, istemci tarafında yürütülen bir sayfaya gömülü komut dosyalarını, yani sunucu tarafında değil kullanıcı tarayıcısını hedefler. Bu kusurlar, uygulama güvenilir olmayan verileri aldığında ve doğrulamayı yapmadan web tarayıcısına gönderdiğinde ortaya çıkabilir.

Saldırganlar, bu durumda mağdur olan tarayıcılarda kullanıcılar üzerinde kötü amaçlı komut dosyaları çalıştırmak için XSS kullanabilir. Tarayıcı, komut dosyasının güvenilir olup olmadığını bilmediğinden, komut dosyası çalıştırılır ve saldırgan oturum çerezlerini ele geçirebilir, web sitelerini tahrif edebilir veya kullanıcıyı istenmeyen ve kötü niyetli bir web sitesine yönlendirebilir.

XSS, saldırganın kurbanın tarayıcısındaki komut dosyalarını çalıştırmasını sağlayan bir saldırıdır.

 

Konuyu görüntüleyen kullanıcılar

Üst