SQL Injection 1 (Web for Pentester) Tüm Detaylar

Merhabalar, Web for Pentester’da yer alan XSS Zafiyetlerinin ardından bugün, SQL Injection kısmına giriş yapıyoruz.

XSS Zafiyetlerine ulaşmak için: http://www.halilbalim.com/category/web-for-pentester/

SQL Injection 1. örnekte farklı bir şey yapıp, ne kadar ileri gidilebileceğini sizlere göstermek istiyorum. Devam eden örneklerde bu yazıda bahsettiğim bazı terimlerin blacklist’e alındığını göreceğiz. Bunun için hadi başlayalım.

İlk olarak Web for Pentester ana sayfasında SQL Injection 1’e tıkladığımızda karşımıza aşağıdaki gibi bir ekran çıkıyor.

Bu ekranda, XSS Zafiyetlerinde olduğu gibi adres çubuğunda yer alan name=root ibaresi dikkatimiz çekiyor. SQL kullanan arkadaşlarımız bileceklerdir, buraya ilk olarak şöyle bir “injection” yapıyoruz: name=root’ OR ‘1’=’1

Bunu yazarken dikkat edilmesi gereken nokta root’un sonundaki tırnak işareti ve son 1’den sonra koyulmayan tırnak işareti. Çünkü veri tabanına giden sorgu, sayfa ilk açıldığı zaman bu şekilde olmaktadır.

Select * from users where id=’root’

Bizim araya inject ettiğimiz haliyle oluşan sorgu da bu tırnak işaretleri sayesinde aşağıdaki şekilde oluşuyor. Bu sayede, 1=1 sorgusu 1 döndüğü için (bir nevi where parametresi bypass edilmiş oluyor) sadece root kullanıcı değil, sistemde kayıtlı olan tüm kullanıcı listesini yazdırabiliyoruz.

Select * from users where id=’root’ or ‘1’=’1′

Adres çubuğuna name=root’ OR ‘1’=’1 girdiğimizde, arkada yukarıdaki gibi oluşan sorgu, bize aşağıdaki gibi bir ekran getiriyor.

Bir çok sayfada, bu seviye için böyle bir injection yapıp diğer örneğe geçilmiş. Fakat, ben bu yazıda, yukarıda da bahsettiğim gibi, bu zafiyet nereye kadar exploit edilebilir diye gidebildiğim kadar ileri gideceğim.

Select * from users where id=’root’ UNION SELECT 1,2,3,4,5 — –

Yukarıdaki sorgu kalıbında 1,2, .. 5 yerlerine yazılan yerler kolon sayısını temsil eder, bu rakamlardan herhangi birinin yerine yazdığınız değişkenlerin değeri ise o kolonda yazdırılır. Bu kısmı daha iyi anlamanız için aşağıda yer alan görseli inceleyebilirsiniz. (UNION ifadesi iki tabloyu birleştirmeye yarar ve tek bir sonuç görüntüler, fakat bunu yaparken iki tabloda çekilen sütun sayısının aynı olması gerekmektedir)

Bu kalıbın sonunda yer alan “– -” kısmı ise kodun sorgunun inject edildiği yerden sonraki kalan kısmı yorum satırı yapmaya yarar. Bunun yerine, yine kalan kısmı yorum satırına dönüştürmek için HTML karşılığı # (hashtag) olan %23 de yazabilirsiniz sonuna.

Bu kalıbı kullanarak veritabanının versiyonunu yazdırmak istersek, bu alanlardan birine @@version yazmamız yeterli olacaktır. Aşağıdaki resimde adres çubuğunda görüldüğü gibi yazınca, SQL versiyonunu ikinci sütunda görüntülemiş olduk.

Bu zafiyeti kullanarak bir adım daha ileri gidip ve veritabanında kayıtlı olan tabloları görüntüleyeceğim. Bunun için aşağıda yer alan kalıbı kullanacağız.

Select * from users where id=’root’ UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables LIMIT 1,23 — –

Adres çubuğuna yazmış olduğumuz name=root’ UNION SELECT 1,table_name ,3,4,5 FROM information_schema.tables — –aşağıda gördüğümüz gibi bize information.schema’da yer alan tabloları listelemiş oldu. ( Resimde yer alan sonuç LIMIT fonksiyonu ile daraltılmıştır. )

Information.Schema, ilişkisel veritabanlarında salt okunur birer view içerir. Bu şekilde bu veritabanlarının tabloları, kolonları vb bilgilerine ulaşılabilir.

Yukarıda da görüntülendiği üzere, users adında bir tablo dikkatimizi çekiyor. Bu tablodan bazı bilgilere ulaşabileceğimizi varsayarak (apaçık ortada aslında) bu tablo üzerinden ilerliyoruz.

UNION SELECT 1,column_name,3,4,5 FROM information_schema.columns WHERE table_name = ‘users’ — –

Yukarıdaki kalıbı kullanarak users tablosunda yer alan kolon isimlerini aşağıdaki gibi listeleyebiliyoruz.

Geriye yapılacak işlem, kolon isimlerini ve içeriklerini sayfaya yazdırmak oluyor. Aşağıda resimde de görüntülendiği üzere, database’de kayıtlı kullanıcılar ve onların şifrelerini adres çubuğunda yer alan sorgu aracılığıyla çekmiş oluyoruz.

SQL Injection 1. örnek ile ne kadar ileri gidebileceğimizi elimden geldiğince sizlere göstermeye çalıştım. SQL Injection’ın diğer örneklerinde ise sizlere, sadece o örnekte bulunan engelleme ve blacklistlerden ve bunları nasıl bypass edeceğimizden bahsedeceğim.

Web for Pentester’in diğer örneklerinde görüşmek üzere.

1 Comment

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir