SQLMap原始碼分析 前置發包中的WAF檢測

2022-01-18 03:05:33 字數 3853 閱讀 7515

在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()方法,該方法返回兩段文字的相似度,相似度的演算法如下:我們假設兩段文字分別為text1text2,他們相同的部分長度總共為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_payloadsettings.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比如超時,也證明存在注入

其流程為:

以前的sqlmapwaf資料夾,裡面包含了一些44種常見的防火牆特徵

其流程為:

在sqlmap中檢測waf的方式是傳入乙個**,獲取**內容與頭部資訊,然後檢測是否存在該waf的特徵值,如果存在,就讓retval為真並且返回這個值

判斷waf特徵值則是利用正規表示式實現的,比如:

'yunsuo':[

'retval = re.search(r"

'retval = re.search(r"yunsuo_session",headers_get, re.i)'

]

但是這種方式的侷限性在於無法涵蓋所有的wafsqlmap的開發人員應該也是考慮到這一點去除了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...