在sqlmap檢測sql注入點的過程中,會有一系列前置發包,這些前置發包主要包括
**連通性檢測
waf探測
網頁穩定性檢測
引數動態性檢測
啟發式注入檢測
誤報檢測
這裡著重於waf
檢測原始碼的分析,但提到waf探測
不得不提到網頁相似度對比
雖然名字沒咋聽過,不過其實很容易理解,簡單舉個例子:
在使用自動化注入的過程或者使用掃瞄器的過程中,如何判斷當前遇到了防火牆
稍作思考其實就能夠知道,我們可以通過檢測正常網頁和傳遞了payload
網頁兩者返回狀態的不同判斷是否遇到了waf
比較簡單的方式是直接看返回網頁的狀態碼,如果為404或者響應超時肯定就遇到了waf
稍微好一點的方式是計算正常網頁的md5
值和傳遞了payload
的網頁的md5
值,不過這個方法過於雞肋,因為不管是相同還是不同,你都不能判斷是否存在漏洞或是遇到了waf
,因為頁面稍有不同就會導致md5
計算的不一致
更好一點的方法就是一些很出名的計算頁面相似度的演算法了,我們可以直接拿來用,比如tf-idf演算法
,余弦相似度計算
,simhash
等等,各有優劣,可以根據不同的應用場景進行選取
在sqlmap
中使用difflib
這個模組來進行頁面相似度的對比,實際處理的時候,sqlmap 並不僅僅是直接計算頁面的相似度,而是通過首先對頁面進行一些預處理,預處理之後,根據預設的閾值來計算請求頁面和模版頁面的相似度。比如說,我們設定乙個閾值0.8
,如果輸入payload
之後網頁與正常網頁的相似度計算後大於0.8
,即強相關,我們則認定沒有遇到waf
。
在difflib
模組中存在ratio()
方法,該方法返回兩段文字的相似度,相似度的演算法如下:我們假設兩段文字分別為text1
與text2
,他們相同的部分長度總共為m
,這兩段文字長度之和為t
,那麼這兩段文字的相似度定義為2.0 * m / t
,這個相似度的值在 0 到 1.0 之間
一般來說針對某一型別漏洞,其頁面相似度的閾值是需要對不同頁面大量測試之後取相對穩定的值,sqlmap
的編寫人員根據他們的演算法和測試取值為0.02-0.98
,因為該演算法不是本文的重點,在此處略過
waf
檢測**在checkwaf()
方法中,在start()
方法中,sqlmap
初始化完成後就會開始檢測防火牆
checkwaf()
if conf.nullconnection:
checknullconnection()
checkwaf()
函式的注釋資訊有:
@stackedmethod
def checkwaf():
"""reference:
"""
該檢測waf
的方法實際上來自nmap的http-waf-detect.nse
:
比如頁面為index.php?id=1
,那現在新增乙個隨機變數index.php?id=1&aaa=2
,設定paoyload類似為and 1=1 union all select 1,2,3,table_name from information_schema.tables where 2>1-- ../../../etc/passwd
,如果沒有waf,頁面不會變化,如果有waf,因為payload中有很多敏感字元,大多數時候頁面都會變成waf防護頁面。
sqlmap
中構造的payload
為
payload = "%d %s" % (randomint(), ips_waf_check_payload)
其中ips_waf_check_payload
在settings.py
檔案中,為
ips_waf_check_payload = "and 1=1 union all select 1,null,'',table_name from information_schema.tables where 2>1--/**/; exec xp_cmdshell('cat ../../../etc/passwd')#"
經過一系列處理後傳送payload
try:
retval = (request.querypage(place=place, value=value, getratiovalue=true, noteresponsetime=false, silent=true, raise404=false, disabletampering=true)[1] or 0) < ips_waf_check_ratio
except sqlmapconnectionexception:
retval = true
finally:
kb.matchratio = none
此處的ips_waf_check_ratio
# ratio used in heuristic check for waf/ips protected targets
ips_waf_check_ratio = 0.5
sqlmap
檢測到與原始請求響應相似度小於0.5時,認為存在waf。
如果出現except
比如超時,也證明存在注入
其流程為:
以前的sqlmap
有waf
資料夾,裡面包含了一些44種常見的防火牆特徵
其流程為:
在sqlmap中檢測waf的方式是傳入乙個**,獲取**內容與頭部資訊,然後檢測是否存在該waf的特徵值,如果存在,就讓retval為真並且返回這個值判斷
waf
特徵值則是利用正規表示式實現的,比如:
'yunsuo':[
'retval = re.search(r"
'retval = re.search(r"yunsuo_session",headers_get, re.i)'
]
但是這種方式的侷限性在於無法涵蓋所有的waf
,sqlmap
的開發人員應該也是考慮到這一點去除了waf
資料夾,使用頁面相似度來判斷是否存在防火牆
現在的檢測思路為:
構造惡意payload -> 檢查響應 -> 檢查相似度 -> 判斷waf
TP5原始碼分析前置知識 簡單工廠模式
一 白話解釋一下 所謂工廠就是為不同客戶生產不同的玩意,那麼程式裡面的工廠有著異曲同工之妙,例如你要new 車相關的類 是不是每種車要自己去new?現在我換種做法,我們把new的過程交給工廠去幹,我只要告訴你型別,你就給我new什麼。二 看看最簡單的工廠democlass carclass bike...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...