Enjeksiyon saldırıları, kullanıcılardan gelen dataların kontrol edilmeden komutlarda veya veritabanı sorgularında kullanılmasıyla meydana gelir. SQL Injection saldırıları da aynı mantıkla hedef web sitesinin kullandığı veritabanında yetki olmaksızın sql sorguları çalıştırılmasını sağlamaktadırlar.
Damn Vulnerable Web Application (DVWA) üzerinde güvenlik açıklıklarını barındıran bir PHP/MySQL uygulamasıdır. Uygulama 3 seviye için test ortamı sağlar; düşük, orta, zor ve uygulama aracılığı ile web uygulama güvenliği üzerine öğrendiklerinizi rahatlıkla test edebilirsiniz. Başlangıç seviyesi için oldukça uygundur. Daha önceki yazımda Reflected XSS için düşük ve orta düzey çözümlerini anlatmıştım, o yazıya buradan ulaşabilirsiniz. Ama ben bu yazımda DVWA’nın düşük düzey SQL Injection’ını manuel olarak nasıl çözebileceğinizi anlatacağım.
1. İlk olarak metin kutumuza herhangi bir sayı girerek deneme yapıyoruz. Ben 1 ile deneme yaptım ve sonuç aşağıdaki gibi oldu. Yani metin kutusuna girdiğim değeri ID yerine yazdı ve en önemlisi veritabanına erişim sağlayarak bu ID’ye sahip olan kullanıcının ismini ve soyismini ekrana bastı.
2. SQL Injection için klasik başlangıcı yapıp metin kutusuna 1′ yazıp ne sonuç döneceğini görmek istiyorum. Çünkü eğer tırnak (‘) işaretçisi için escape işlemi yapıyorsa atlatmak için başka bir yöntem düşünmem gerekecek. Ayrıca öncelikli amacımın hata almak olduğunu da söylemem gerekiyor, çünkü alacağım hatalar beni yönlendirecektir.
3. Yukarıda gördüğünüz hata önemli. Benim girdimin sistem tarafından görünüşü hakkında bilgi veriyor bana. Buradan çıkardığım sonuç şu: evet, tırnak kullanılabilir; bununla ilgili herhangi bir kontrol yapılmıyor. O zaman bir sonraki aşamada deneyeceğim şey şu olacak az önce tırnağı ben kendi tarafımda kapatmıştım, o da backend tarafında kapatmak isteyince hata almıştım. Buna çözüm olarak da girdimde “#” kullanarak geri kalanı yorum haline getirebilirsem, problemimi çözmüş olurum.
4. Bir sonraki aşamam bir mantık işlemi olacak. 1′ or ‘0’=’0’# yada 1′ or ‘0’=’0 yazmam arasında şu aşamada bir fark bulunmayacaktır. İkisi de bana ilgili veritabanının ilgili tablosundaki tüm kullanıcıların isim ve soy isimlerini verecektir. Burada or işleminin kendi yapısından faydalanıyoruz. Uygulama iki durum da true sonucunu döneceği için ilk satırdan başlayarak tüm satırları gezecek ve ilgili sql sorgusunda istenen tüm tablo değerlerini aşağıdaki resimde gördüğünüz gibi ekrana basacaktır.
5. Bunu gördükten sonra biraz rahatlıyoruz. Siber güvenlikle alakalı hangi kitabı okursanız okuyun her uygulamanın bilgi toplama başlığı ile başladığını görürsünüz. Hatta Kali dağıtımının Kali Linux menüsüne bakarsanız orada da ilk başlığın bilgi toplama araçlarını içerdiğini görürsünüz. Bu yüzden bu noktadan sonra yapacağımız şey bilgi toplayıp, bu bilgileri adım adım kullanmak.
İlk aşamada uygulamamızın hangi versiyon MySQL kullandığını anlamak istiyorum. Bunu yapmanın yolu union sorgusu yazmaktan geçiyor. Ancak union sorgusu yazarken unutmamam gereken bir şey var union ile birleştireceğim iki sorgunun vereceği sütun sayısı aynı olmalı. Union’dan önceki sorgumun veritabanından 2 sonuç döndüğünü biliyorum, o zaman sonrası da 2 sonuç döndürmeli.
1' and '0'='0' union select database(),version() #
6. Sorgunun sonucunda gördüğümüz üzere kullandığımız veritabanının isminin dvwa, kullandığımız MySQL versiyonunun da 5.5.44-0+deb7u1 olduğunu öğrenmiş olduk.
Bu bilgilerin ışığında artık tablo isimlerini information_schema yardımı ile öğrenebilirim.
1' and '0'='0' union select null,table_name from information_schema.tables where table_schema = 'dvwa' #
Ayrıca veritabanı ismini bildiğim için görmek istediğim tabloları da sınırlayabilirim, aksi takdirde mysql üzerindeki tüm tabloların arasından işime yarayacak tablo isimlerini aramak zorunda kalacaktım.
7. Böylece dvwa üzerindeki tüm tabloları görebiliyorum. users benim ihtiyacım olan tablo olduğu için artık users tablosunun sütun isimlerini görmek istiyorum.
1' and '0'='0' union select null,column_name from information_schema.columns where table_name = 'users' #
8. Artık son adıma geldik bu çok klasik bir select sorgusu tek istediğim user ve password bilgisi sonuçta.
users tablosunun tüm sütunları arasından benim için önemli olanlar user ve password aslında; ancak ben concat fonksiyonunun da kullanımını görün istediğim için onu da kullandım. concat fonksiyonu sayesinde user_id ve user sütunları içerisindeki bilgileri bir arada çekebildim ve ikisini birbirinden ayırt edebilmek için de “0x0a” ile yeni satır oluşturup user bilgilerini yeni satır oluşturduktan sonra yazmasını sağladım.
Böylece veritabanındaki kullanıcı adları ve parolalara erişmiş oldum. Parolaların hashleri alınmış olarak tutulduklarını görüyorum. Hashlerin karşılıklarını görmek için bir sözlük saldırısı yapan araç kullanmam yeterli olacaktır. Örneğin; john-the-ripper ya da hashcat‘i deneyebilirsiniz.
Bunu paylaş:
Tweet
WhatsApp
Telegram
Daha fazla
Tumblr' da Paylaş
Pocket
E-posta
Yazdır
Bunu beğen:
Beğen Yükleniyor...
İlgili
In Güvenlik, Teknik, Veritabanı	dvwa, güvenlik, security, sql injection, sqli	
Ayşe Bilge Gündüz
Posts Website Twitter Facebook
Ayse Bilge akademik bir kariyer hayaliyle başladığı bu yolda 6 yıllık araştırma görevliliğinin ardından Ericsson Araştırma ekibinin içerisine Güvenlik Araştırmacısı olarak dahil oldu. İşi gücü Siber Güvenlik ve Yapay Zeka...	