Ana içeriğe atla

DVWA SQL Injection Uygulaması (Low Level)

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ılarımda Reflected XSS için düşük ve orta düzey çözümlerini anlatmıştım, o yazılara buradan ve şuradan 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ırd 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'ı deneyebilirsiniz.

Yorumlar

Bu blogdaki popüler yayınlar

Adım Adım Weka Kullanımı

WEKA bir veri madenciliği uygulamasıdır ve Yeni Zellanda'daki Waikato Üniversitesi tarafından geliştirilmektedir. Bu yazının amacı WEKA Explorer'ı kullanmayı öğretmektir.


Weka ile Sınıflandırma

"Preprocessing" aşamasında veri setimizi yükledik ve eğer gerekliyse ön aşamadan geçirdikten sonra sınıflandırma aşamasına geçebiliriz. Weka nedir, Ön İşlem bölümünde neler yapılır sorusunun cevapları için önce bu yazımı okumalısınız.
SINIFLANDIRMA
Verimizi ön işlemden geçirdikten sonra artık sınıflandırabiliriz. WEKA'yı kullanarak bir çok sınıflandırıcıyı kullanabilirsiniz; Karar Ağaçları, SVM, Multi-layer Perceptrons vs. Veri setinizi yükledikten sonra Classify bölümüne tıklayarak sınıflandırma sayfasına erişebilirsiniz. Ön tanımlı ayarlara göre ZeroRalgoritması gelmektedir. Bu algoritmanın başarımı çok düşük olduğu için ben "Iris" veri seti için iyi sonuç verdiği bilinen J48 algoritması ile devam edeceğim:

Java ile Thread Pool Kullanımı

Oluşturacağımız uygulama 100 x 100 boyutlu bir matrisin içerisinde arttırma işlemi yapacaktır. Bu işlem için Runnable yada Callable sınıfı kullanılabilir. Runnable objesi olarak tanımladığımızda threadlerimiz sonlandırılana kadar sürekli olarak çalışacak ve kuyruğu sürekli olarak kontrol edip yeni bir görev olup olmadığına bakacaklardır. Thread class'ımız bize execute() adında bir method kullanım imkanı sağlamaktadır; execute(Runnable myR) şeklinde bir kullanım ile kuyruğa yeni Runnable objeler eklememize imkan sağlamaktadır.