Öncelikle “Sql Injection” denilen şeyin ne olduğundan kısaca bahsedeyim. Daha sonra bir “Injection” örnek saldırısı yapalım. Bu işlem gerçektende bir iğneyle insan vucuduna zehir enjekte etmek gibidir. Burada sadece enjekte ettiğimiz şey, zehir değil koddur. Deyimdeki insan vucudunu ise sistemin kendisi olarak betimleyebiliriz. Sistem olarak bir web sayfasını örnek verelim. Bir web sayfası, kullanıcı adları, şifreler ve site içerisindeki diğer içerikler gibi bir çok bilgisini bir veri tabını servisi aracılığı ile veritabanlarına kaydeder ve gerekli gördüğünde tekrar okur. Bu işlemi, tcp/ip protokolünde bir veritabanı servisi ile “SQL cümlecikleri” ismini verdiğimiz komut setleri halinde konuşarak yapar. İşte bu konuşmalar arasına bazı kodlar enjekte ederek veritabanı servisine web sayfasının değil de bizim istediklerimizi yapmasını söyleyebiliriz.
Aslında konuyu anlayabilmek için daha önce veritabanı kullanmış ve en azından bununla alakalı herhangi bir dilde küçük bir program yazmış olmanız gerekiyor. Eğer daha önce hiç program yazmadıysanız, okuduklarınız sizin için sadece genel kültür olacaktır. Ama bir yerden başlamak istiyorum diyorsanız; başlayacağınız nokta, bir programlama dili öğrenmek ve bu programlama dilinde basit bir veritabanı işlemi yapmak olmalı.
Peki. Bir sisteme kendi kodumuzu nasıl enjekte edebiliriz? Aslında her sistem, kullanıcılardan bazı girdiler alır. Mesela, bir siteye hesap açtığınızda o siteye bazı bilgiler girersiniz. Aslında enjekte edersiniz. Sistem, bu bilgileri alıp kendi kodları arasına gömerek veritabanı servisine gönderir. Fakat kötü bir amaç taşıyorsanız, siteye girdiğiniz bilgiler yerine kendi kodlarınızı girebilirsiniz. Bu sayede web sayfası, kendi kodları arasına sizin kodlarınızı gömer ve veritabanı servisine gönderir. Veritabanı Servisi, gelen kodları incelediğinde bir de ne görsün, kod içinde kod var. İki kodu da işletir. Ve tebrikler sisteme kod enjekte ettiniz. Örneğin bir web sayfasının “login” girişini düşünün. Oradaki Şifre alanına şifre yazmak yerine şöyle bir şey yazdınız; yusuf” OR 1=1. Şimdi yazdığınız şifreyi, web sayfası veritabanına göndererek şu şekilde aratır;
“1” herzaman “1”e eşittir. OR operatörü sayesinde benim şifre kısmına ne yazdığım önemini kaybetmiş oldu. Veritabanı servisi bu kodu işlettiğinde web sayfasına herzaman; evet şifre doğru şeklinde dönecektir. Bu sayede sisteme girmiş olduk. Bunun gibi yığınla örneği bu adresten bulabilirsiniz; https://www.w3schools.com/sql/sql_injection.asp
Şimdi geçelim sqlmap olayına. Sqlmap açık kaynak kodlu bir sql test programıdır. Aslında sqlmap yukarda verdiğim örnekleri deneyerek veritabanına sızmaya çalışır. Size sadece bu programa bunları test et demek düşer. Sqlmap açık kaynak kodlarını “https://github.com/sqlmapproject/sqlmap” sayfasından indirebilirsiniz ve kendi sisteminize göre derleyip kullanabilirsiniz. Ayrıca burada komutları ve kullanım şekilleri de var. Aslında bu tarz şeylerle uğraşmak için en elverişli ortam linuxtür. Yani bu gibi şeylere merak saldıysanız Linux kullanmaya başmanız gerekiyor.
Şu anda Linux, Kali kullanıyorum. Bu işletim sisteminde istemeyeceğiniz kadar hack aracı kurulu geliyor. Sqlmap’da bunlardan birisi. Doğal olarak ben yükleme gereği duymadım. Sqlmap’ı sisteminize kurduktan sonra komut satırından “sqlmap” komutuyla testlerinize başlayabilirsiniz.
Mesela şöyle bir komut ile bir web sayfası için bir “injection” testi yapalım;
Web sayfalarının linklerininin sonunda “?parametre0=değer0¶metre1=değer1….” gibi ibareler görebilirsiniz. Bu ifadeler, php dilinde GET ve POST metotları denilen kullanıcılardan ve ya içeriklerden bilgi almak için kullanılan fonksiyon çıktılarıdır. Web sayfaları, genellikle içerikleri aratmak ve görüntülemek için o içeriklere bir ID verir ve “?id=66” da girdiğiniz sayfanın içeriğinin ID’sidir. Şimdi doğal olarak bu linkte aslında SQL cümleciğine gömülen parametre, 66 sayısıdır. Siz “66” sayısı yerine kendi kodlarınızı yazarak SQL Injection yapmayı deneyebilirsiniz. Yukarıdaki komut, sqlmap’a tam da bunu yaptırıyor. Sqlmap, yukarıya yazdığımız linkteki “?” ibaresi gördüğü yere Injection testleri yapmaya başlar ve “–dbs” seçeneği ile veritabını sızıp veritabanı listesini çıkartabilmemizi sağlar. Eğer linkte birden fazla parametre varsa; hangi parametreye injection uygulamak isterseniz, yanına “*” ifadesi koymanız yeterli olacaktır. Mesela “http:/localhost/yazi.php?category=elektronik*&page=2&search=” linkini yazarsanız, sqlmap; category parametresine sql injection yapmayı dener.
Bu komutu girdikten sonra, sqlmap açık bulup veritabanına sızabilirse, size veritabanı listesini verir. Sızamazsa, –risk ve –level seçenekleriyle testin risk ve seviyesini arttırmanızı isteyebilir. Diğer bir ihtimalle, web sayfası ve veritabanı servisi arasında ismine WAF/IPS/IDS denilen bir çeşit veri doğrulama sistemi kullanılıyor olabilir.
komutuyla testin risk ve seviyesini belirleyebiliriz. Risk seçeneği seviyesi 1’den 3’e kadar level seçeneği seviyesi ise 1’den 5’e kadardır. Bu seviyeler şunları belirtir;
–risk=1: Github2da zararsız bir enjeksiyon yöntemi olarak betimleniyor.
–risk=2:Zaman tabalı saldırı seçeneği
–risk=3: OR operatörü tabanlı saldırı seçeneği
–level=1 100’den az istek göndererek test yap
–level=2 100 ve 200 arasında istek göndererek test yap.
–level=3 200 ve 500 arasında istek göndererek test yap.
–level=4 500 ve 1000 arasında istek göndererek test yap.
–level=5 1000 den fazla istek göndererek test yap.
Eğer hedef sayfa “WAF/IPS/IDS” tarzı servisler kullanılıyorsa bu servislere saldırıp etkisiz hale getirilmesi için yazılmış çeşitli scriptleri kullanabiliyoruz. Öncelikle böyle bir servis kullanılıp kullanılmadığını anlamak için –identify-waf seçeneğini kullanabilirsiniz. Eğer bu servis kullanılıyorsa zaten loglarda kullanıldığına dair ibaretleri görebilirsiniz. Bu servislere karşı kullanılan scriptlerin ne mantıkda yazıldığını ben de bilmiyorum ama bu scriptler zaten sqlmap ile beraber geliyor. Size sadece –tamper=”script dosyası lokasyonu” seçeneğini kullanmak düşüyor.
Halen açık bulamadıysanız, “–data”, “–cookie”, “–dbms” gibi seçenekleri de kullanarak testinizi güçlendirebilirsiniz. “–data” seçeneği POST ve GET metodlarını çağırmak için kullanılır. “–cookie” ise bir SessionID gibi sistemin tarayıcıya göndermiş olduğu bazı değişkenleri kullanarak saldırmaya yarar. “–dbms”, seçeneği hedef sistemin veritabanını tanımlamanıza yarar. Bunun için hedef sayfanın kullandığı veritabanı hakkında tahminlerinizi olması gerekiyor. Bu ve bu gibi daha bir çok seçeneği sqlmap ın kendi reposundan öğrenebilirsiniz.
Açık bulduysanız, -D ve -T seçeneklerini kullanarak veritabınındaki tabloları ve bu tablolardaki kolum değerlerini çekebilirsiniz. Örneğin;
Aslında bir güvenlik açığı bulduktan sonra veritabanını komple ele geçirebiliyoruz. Artık istediğimiz veriyi ekleyip istediğimiz veriyi silebilir veya arayabiliriz. Bunun için shell komutunu kullanabiliriz.
Bu komutlar sadece sqlmap için başlangıç sayılır. Sqlmap’ın gerçekten çok geniş test arayüzleri mevcuttur. Bu arayüzleri kullanabilmek ve ya öğrenebilmek sizin programcılık ve sistem bilginize dayanıyor. Bu yüzden hacker olmak istiyorsanız sqlmap gibi kendi hack programlarınızı yazabilecek kıvamda olmalısınız.
Eline sağlık
Afiyet olsun 🙂