SQL Injection (Manuel) Açığı ve SQL Komutları – Adım Adım Videolu Anlatım
SQL injection nedir? nasıl yapılır konusuna geçmeden bilmemiz gereken bazı şeyler var. Ezbere gitmemek amacıyla bazı SQL komutlarını bilmemiz çok faydalı olacaktır diye düşündüğüm için temel SQL kodlarını kısaca açıklıyor olacağım. SQL açığına başlamadan aşağıdaki komutları incelemenizi şiddetle tavsiye ederim. Dilerseniz yazının sonunda yer alan video ile de uygulamalı SQL injection nasıl yapılır öğrenebilirsiniz. Açıklı siteleri bulabilmek için google dorklarından yararlanabilirsiniz. İlgili yazıma gitmek için buraya tıklayın.
Temel SQL Komutları
Select:
SELECT secilecek_alan_alanlar FROM tablo_veritabanı_kolon
Kullanımı: SELECT * FROM personel
Yukarıdaki kod parçaçığı ile “SELECT” sql komutunun genel kullanımını gördünüz. Yukarıda yaptığımız işlem, personel tablosundan tüm verileri seçmek oldu.
Yani anlayacağınız üzere “select” komutu tablodan veri seçmemize olanak sağlıyor.
From:
From komutu seçimlerimizi hangi veri tabanından, hangi tablodan yada hangi kolondan yaptığımızı belirtmemizi sağlıyor. Kullanımı ise Select kısmında belirtildiği gibi.
Where:
SELECT secilecek_alan_alanlar FROM tablo_veritabanı_kolon WHERE şartlar
Kullanımı: SELECT * FROM personel WHERE ad=”Ahmet”
Yukarıda, yine personel tablosundan veri seçimi yaptık. Fakat bu sefer Where ile şartımızı belirttik. tablodan sadece adı Ahmet olan personellere ait tüm bilgileri çektik.
Yani “where” komutu tablodan çekeceğimiz veriyi şartlandırmamızı sağlıyor. Where’den sonra şartlarımızı belirtiyoruz.
Or:
SELECT secilecek_alan_alanlar FROM tablo_veritabanı_kolon WHERE şart1 or şart1
Kullanımı: SELECT * FROM personel WHERE ad=”Ahmet” or ad=”Serpil”
Yukarıdaki kullanımda tablodan adı Ahmet olan yada Serpil olan personelleri çektik.
Matematikteki yada bağlacı. Diğer programlama dillerinde bildiğimiz “or”. Seçim yaparken ifadelerin doğru olup olmamasına göre önermeyi doğru yada yanlış olara nitelendirmemize olanak sağlıyor. Eğer or içeren önermede bir tane doğru ifade varsa, önermeyi doğru kabul ediyoruz.
Order By:
SELECT secilecek_alan_alanlar FROM tablo_veritabanı_kolon WHERE şart1 or şart1 ORDER BY siralama_parametresi
Kullanımı: SELECT * FROM personel WHERE ad=”Ahmet” or ad=”Serpil” ORDER BY dogum_tarihi
Yukaridaki kod ile aldığımız sonuçları doğum tarihine göre sıraladık. (* ile tüm verileri belirtmiştik, bu verilerin içerisinde dogum_tarihi bölümü olduğunu unutmayın)
Anlayacağınız üzere Order By, sonuçlarımızı belirlediğimiz parametreye göre sıralamamızı sağlıyor.
Union:
SELECT secilecek_alan_alanlar FROM tablo_veritabanı_kolon WHERE şart1 or şart1 UNION SELECT secilecek_alan_alanlar FROm tablo_veritabanı_kolon_2 WHHERE sart ORDER BY siralama_parametresi
Kullanımı: SELECT ad, soyad, dogum_tarihi FROM personel UNION SELECT ad,soyad,dogum_tarihi FROM yönetici ORDER BY dogum_tarihi
Yukarıdaki kod parçası ile personel tablosundan ve ve yönetici tablosundan “ad, soyad ve doğum tarihi” bilgilerini çekip doğum tarihine göre sıraladıktan sonra tek bir tablo ile ekrana yazdırdık.
Bana göre en önemli SQL veritabanı komutlarından bir tanesi “UNION” Union ifadesi çoklu seçim yaptığımızda seçimlerimizi birleştirerek bize tek bir tabloymuş gibi getiriyor fakat dikkat etmemiz gereken bazı hususlar var:
- Union kullanarak birleştirdiğimiz her seçim ifadesi eşit sayıda kolon içermelidir. (Kolon=Column)
- Kolonlar aynı veri tipine sahip olmalıdır.
- Seçilen kolonlar aynı sırada olmalıdır.
- Union ile tekrarlı ifadeler 1 kez alınır. Hepsini seçmek için “UNION ALL” kullanabilirsiniz.
Versiyon, Database İsmi ve Kullanıcı Bilgileri – version(), database(), user():
Sırada işimize yarayabilecek temel SQL fonksiyonları var. tek tek bu fonsiyonları inceleyelim.
version()
version() fonksiyonu veritabanına ait versiyon bilgisini verir.
database()
database() fonksiyonu veritabanının ismini verir.
user()
user() fonksiyonu MySQL bağlantısı için o anki güncel kullanıcı bilgisini verir.
SQL Injection
SQL Injection (SQL Enjeksiyonu) zafiyeti OWASP’da kritik olarak değerlendirilmekte olan son derece önemli bir güvenlik açığıdır. Saldırganlar SQL Injection açığı sayesinde kurbanlarının tüm veritabanını ele geçirebilmektedir. Bu zafiyet birkaç çeşide ayrılmaktadır. SQL Injection türleri şunlardır:
- Error Based SQL Injection
- Blind SQL Injection
- Time Based SQL Injection
Yukarıda bahsedilen SQL Injection türleri de kendi içlerinde dallara ayrılmaktadır.
SQL Açığı Tespiti – SQL Injection Nasıl Tespit Edilir?
DVWA arayüzünü açıp, SQL injection bölümüne gittim. Karşımda benden “id” değeri girmemi isteyen submit kutucuğu var. 1, 2 ,3.. gibi değerler denedim. Bana verdiğim id değerine göre o id’ye sahip olan kullanıcıya ait bilgileri getirdi.
MySQL tarafında dönen kod aşağıdakine benzer birşey olmalı:
SELECT id, firstname, surname FROM tablo WHERE id="girdiğim değer"
Peki ben buraya kendi sql kodumu nasıl enjekte edebilirim? Bunun için hemen bir deneme yapıyorum. Benden istenilen id değeri olarak ” 1′ ” değerini giriyorum. Eğer tırnak işareti ile girdiğim id değeri, websitesine SQL Syntax Error verdirirse burada SQL açığı olabilir diye düşünmemi sağlayacak.
Gördüğünüz şekilde gibi id değerimi tırnak işareti ile birlikte girdim ve aşağıdaki hatayı aldım.
Yani anlayacağınız üzere, bu internet sitesinde SQL injection yapabilme ihtimalim var. Bu sonuca vardıktan sonra hemen kendi SQL komutları siteye enjekte etmeye başlıyorum.
SQL Kodlarının Enjekte Edilmesi
SQL kodlarımızı sitede çalıştırmaya başlamadan önce daha iyi anlaşılması açısından hemen baştaki kodumuza bir dönelim. Hatırlarsanız verdiğimiz id değerine göre arkada dönen işlem şu şekildeydi:
SELECT id, firstname, surname FROM tablo WHERE id="girdiğim değer"
Bundan sonra bizim yapacağımız şey, bu ifadenen sonuna yeni sql komutları eklemek olacak, peki bu komutların çalışmasını nasıl sağlayacağız?
“Or” ifadesi ile id değerinden sonra or 1=1 ifadesini kullanacağız ve yeni ekleyeceğimiz komutları da çalıştırtacağız. Gelin burayı biraz daha açalım:
1=1 ifadesi doğru bir ifadedir. OR bağlacının kullanımını hatırlarsanız, yazdığımız ifadelerden bir tanesinin doğru olması önermeyi doğru kabul etmemiz için yeterliydi. Yani benim girdiğim id değeri yanlış olsa bile 1=1 ifadesi doğru olduğu için devamında gireceğim SQL kodlarını çalıştırtabileceğim.
id değeri olarak yeni girdimiz:
1' or 1=1 #
oluyor. Kodun sonuna ” Neden ‘#‘ koydun? ” diye sorabilirsiniz. ID değerinden sonra girdiğimiz tırnak işaretinin kapatılması gerekiyor, Kapattığımızda ise or ifadesi yüzünden farklı hatalar alıyoruz. Bu yüzden kodun geri kalan kısmını yorum satırı haline getiriyoruz ve hata almadan kodumuzu enjekte etmiş oluyoruz.
SQL Injection ile Veritabanındaki Tablo İsimlerinin Çekilmesi
1' OR 1=1 UNION SELECT null, table_name FROM information_schema.tables #
Kullanacağımız güncel kodumuz yukarıdaki gibi.
Bu kod parçası ile yeni select ifademizi union sayesinde ekledik. Peki neden null kullanıyorum?
Temel SQL Komutları bölümünde açıkladığım gibi, uniondan sonraki select ifadesi ve öncesindeki select ifadesi eşit sayıda kolon yada tablo içermeli. Ama ben burada uniondan sonraki select içerisinde id, firstname ve surname değerlerini çekmiyorum, onların bulunduğun kolon boş olduğu için “null” ifadesini kullandım ve yeni verim olan table_name’i ekledim. Böylelikle information_schema.tables’ten tüm tablo isimlerini çekmiş oldum.
Çıktı:
Gördüğünüz gibi internet sitesinin veritabanında olan tüm tablo isimlerini çektik. Bu liste uzayıp gidiyor… Bana hangi tablo lazım? Ben user bilgilerini içeren tabloyu arıyorum. O halde benim aradığım tablonun adı “user” kelimesini içermeli. SQL like ifadesi tam burada işime yarıyor, ” table_name like ‘user%’ “ şartını kullanıyorum. (% işareti devamı olabileceği anlamına geliyor)
Yeni kodum:
1' OR 1=1 UNION SELECT null, table_name FROM information_schema.tables WHERE table_name like 'user%' #
Çıktı:
Gördüğünüz gibi içerisinde “user” kelimesini barındıran tüm tabloları çektim. Users tablosu doğru tablo olmalı, şimdide o tablonun kolonlarını çekelim.
Users Tablosunun Kolonlarının Çekilmesi – SQL Injection
Geldik tablodan kolonları çekmeye. SQL injection hacking yaparken belkide en çok heyecanlandıran noktalardan bir tanesi de tablodaki kolonların çekilmesi oluyor. Yazıya devam ederken eklemek isterim ki aynı işlemleri sqlmap yada havij kullanarak da yapabilirsiniz, fakat pek öğretici olmayacaktır. İlerde hız kazanmak adına mantıklı olabilir.
Tablodan kolonları çekmek için kullanacağımız kod yapı olarak veritabanından tablonun isminin çekilmesi ile aynı. Sadece table_name yerine column_name kullanıyoruz ve information_schema.tables yerine de information_schema.columns olarak belirtiyoruz.
Kodumuz:
1' OR 1=1 UNION SELECT null, concat(table_name, 0x0a, column_name) FROM information_schema.columns WHERE table_name='users' #
Yukarıdaki kod ile kolonları çekip concat fonksiyonu ile tablo adı – kolon adı olacak şekilde alt alta yazdırdık.
Çıktı:
Kullanıcı Adı Ve Şifre Bilgilerinin Çekilmesi – SQL Enjeksiyonu
SQL açığını sömürme işlemimiz bitmek üzere, bir önceki adımda kolon isimlerini öğrenmiştik. Sırada bu kolonlara ait bilgileri yani kullanıcı adı ve şifre bilgilerini çekmek var.
Ben sadece kullanıcı adı şifre bilgilerini çekeceğim, isterseniz siz first_name, last_name, avatar, user_id gibi diğer bilgileri de çekebilirsiniz, sadece bunları concat fonksiyonuna eklemeniz gerek. Yada tek tek de çekebilirsiniz.
Kodumuz:
1' OR 1=1 UNION SELECT null, concat(user, 0x0a, password) FROM users #
Spesifik olarak çekmek istediğimiz bilgiler user ve password bilgileri olduğu için direkt olarak bunları belirtip çekmek istediğimiz tablonun ismini kaynak olarak göstermek yeterli olacaktır.
Çıktı:
Gördüğünüz gibi kullanıcı adı ve şifre bilgilerini ele geçirdik. SQL injection açığını sömürme işi bu kadar. Bundan sonraki son bir adımımız, MD5 hashlerini kırmak olacak. Bunun için çok fazla alternatif yöntem var ama ben en basit yolu kullanacağım, online tool.
Şifre MD5 Hash’inin Kırılması
Kullandığım online tool’a buraya tıklayarak ulaşabilirsiniz. Belirtilen alana hashleri yapıştırıp, captcha’yı doğruladıktan sonra hashları kırabilirsiniz. Sizin elde ettiğiniz hash bilgilerinin görülme oranına göre burada olup olmama olasılığı mevcut bu yüzden farklı alternatif yöntemler deneyebilirsiniz. Ben DVWA üzerinde çalıştığım için burada MD5’leri kırabilmem normal.
Şifreler:
SQL Injection açığı , manuel SQL injection ve temel SQL komutlarını anlattığım yazım buraya kadardı. Dilerseniz uygulamalı anlatım için aşağıdaki videomu izleyebilirsiniz. Yeni yazılarda görüşmek üzere.
SQL Injection Uygulamalı Videolu Anlatım
Uzun süre Blogger’de acaaba.com adresinde yazılar yazdım. Genel olarak teknoloji, sanat ve psikoloji üzerine bir internet sitesi. Yaklaşık 3 yıldır aralıklı olarak siber güvenlik ile ilgilendim, 2 yıldır da profesyonel olarak bu alanda çeşitli çalışmalar yapmaktayım.
4 comments
“Thank you for doing them all in sync, really helps those, like myself, to get a grasp as to what they think is best for them (others just want to discuss it and not show the quality itself). The tests were a nice addition and, though I wont use them for mics, thank you for putting that in too.
“
Eline sağlık