戰(zhàn):從原理到定制化WAF繞過)
1. 項(xiàng)目概述為什么我們需要深入理解Tamper腳本如果你用過SQLMap大概率遇到過這種情況對(duì)著一個(gè)看起來有注入點(diǎn)的URL跑了大半天結(jié)果要么是“所有參數(shù)似乎都不注入”要么是payload發(fā)出去就石沉大海連個(gè)錯(cuò)誤回顯都沒有。新手這時(shí)候可能就放棄了但老手會(huì)心一笑默默加上--tamper參數(shù)。Tamper腳本就是SQLMap這套自動(dòng)化“大殺器”里的“特種兵”專門負(fù)責(zé)在payload送上前線之前對(duì)其進(jìn)行偽裝、變形、編碼以繞過各種WAFWeb應(yīng)用防火墻、IDS入侵檢測(cè)系統(tǒng)甚至是應(yīng)用層自己寫的蹩腳過濾邏輯。很多人把Tamper腳本當(dāng)成一個(gè)黑盒魔法只知道“這個(gè)站用space2comment能過”卻不知道背后的原理。這就像你只會(huì)按配方做菜卻不懂火候和調(diào)味一旦遇到新奇的防御手段立馬抓瞎。這篇指南的目的就是帶你從“會(huì)用”到“懂原理”再到能根據(jù)實(shí)際情況“自己改”甚至“自己寫”。我們將從最基礎(chǔ)的繞過場(chǎng)景開始拆解經(jīng)典Tamper腳本的每一行代碼理解其設(shè)計(jì)思路最后探討如何組合使用乃至定制開發(fā)高級(jí)繞過腳本。無論你是安全測(cè)試人員、滲透測(cè)試學(xué)習(xí)者還是對(duì)Web安全防御機(jī)制感興趣的研究者掌握Tamper腳本的實(shí)戰(zhàn)精髓都能讓你對(duì)SQL注入攻防的理解提升一個(gè)維度。2. Tamper腳本核心原理與工作機(jī)制拆解2.1 SQLMap的Payload生成與處理流水線要理解Tamper首先得明白SQLMap是如何工作的。它不是簡(jiǎn)單地把一堆預(yù)定義的payload扔出去。其內(nèi)部有一個(gè)完整的引擎工作流程大致如下邏輯判斷與指紋識(shí)別SQLMap首先會(huì)發(fā)送一些無害的探測(cè)請(qǐng)求判斷參數(shù)是否動(dòng)態(tài)、數(shù)據(jù)庫類型通過報(bào)錯(cuò)信息、特有函數(shù)等并嘗試識(shí)別WAF。Payload庫選取根據(jù)數(shù)據(jù)庫類型MySQL, PostgreSQL, SQL Server, Oracle等和注入類型布爾盲注、時(shí)間盲注、報(bào)錯(cuò)注入、聯(lián)合查詢等從龐大的內(nèi)置payload庫中選取基礎(chǔ)模板。Payload渲染將模板中的占位符如[INFERENCE],[SLEEP],[COLUMN]替換為具體的邏輯如比較子句、延時(shí)函數(shù)、列名。Tamper處理這是關(guān)鍵一步。渲染后的原始payload會(huì)依次通過用戶指定的Tamper腳本如--tamper “space2comment,randomcase”。每個(gè)腳本都是一個(gè)Python函數(shù)接收原始payload返回修改后的payload。多個(gè)腳本按順序執(zhí)行前一個(gè)的輸出是后一個(gè)的輸入。請(qǐng)求發(fā)送與結(jié)果分析處理后的payload被嵌入到HTTP請(qǐng)求中發(fā)送SQLMap再根據(jù)響應(yīng)內(nèi)容如頁面差異、時(shí)間延遲、報(bào)錯(cuò)信息來判斷注入是否成功并提取數(shù)據(jù)。所以Tamper腳本的本質(zhì)是一個(gè)Payload變形過濾器。它不關(guān)心注入邏輯只負(fù)責(zé)對(duì)payload的“外觀”進(jìn)行手術(shù)使其能夠逃逸防御系統(tǒng)的檢測(cè)規(guī)則。2.2 常見過濾與繞過思路分類WAF和過濾邏輯千變?nèi)f化但核心思路無非幾種對(duì)應(yīng)的Tamper腳本也圍繞這些思路展開關(guān)鍵字過濾直接攔截union,select,from,where,or,and等SQL關(guān)鍵字。繞過思路大小寫變形UnIoN、內(nèi)聯(lián)注釋分割uni/**/on、編碼URL編碼、HTML實(shí)體、十六進(jìn)制、等價(jià)替換||替代or、注釋混淆union/*random*/select。特殊字符過濾過濾空格、單引號(hào)、雙引號(hào)、等號(hào)、注釋符--、#等。繞過思路空格用/**/多行注釋、、%0a換行、%0d回車、%09制表符甚至多個(gè)空格替代。單引號(hào)用\轉(zhuǎn)義、%bf%27寬字節(jié)、chr(39)字符函數(shù)、0x27十六進(jìn)制替代。等號(hào)用like、between...and...、0 and 2等邏輯替代。語義分析高級(jí)WAF會(huì)嘗試解析SQL語句結(jié)構(gòu)攔截拼接后形成威脅的語句而不僅僅是匹配關(guān)鍵字。繞過思路通過注釋、換行、無效括號(hào)等方式破壞WAF的語法解析例如union(select(1),2)或union/*!50000select*/ 1,2。MySQL特有的內(nèi)聯(lián)注釋/*!...*/在這里是神器因?yàn)镸ySQL會(huì)執(zhí)行其中的內(nèi)容而許多WAF會(huì)忽略或錯(cuò)誤解析。簽名/正則匹配基于已知攻擊payload的特征庫進(jìn)行匹配。繞過思路隨機(jī)化。在關(guān)鍵字中隨機(jī)插入注釋、改變大小寫、添加無關(guān)參數(shù)如version()變成version/*foo*/()使每次請(qǐng)求的payload簽名都不同繞過靜態(tài)規(guī)則庫。實(shí)操心得不要一上來就堆砌Tamper腳本。先用手工測(cè)試判斷過濾類型。例如在參數(shù)后分別添加、and 11、and 12、union select 1,2,3觀察響應(yīng)差異。如果被攔截但and 11和and 12返回相同頁面說明可能只過濾了引號(hào)但沒過濾and和。這個(gè)初步判斷能極大縮小Tamper腳本的選擇范圍。3. 基礎(chǔ)Tamper腳本深度解析與實(shí)戰(zhàn)應(yīng)用這一部分我們挑選幾個(gè)最常用、最具代表性的基礎(chǔ)腳本逐行分析其代碼理解其適用場(chǎng)景和局限性。3.1 space2comment.py空格的經(jīng)典替身這是使用頻率最高的Tamper腳本之一。它的邏輯非常簡(jiǎn)單將payload中的空格字符 替換為多行注釋/**/。#!/usr/bin/env python # 簡(jiǎn)化后的核心邏輯 def tamper(payload, **kwargs): retVal payload if payload: retVal re.sub(r\s, /**/, payload) # 正則匹配所有空白字符包括空格、制表符、換行等 return retVal作用繞過對(duì)空格的過濾。許多簡(jiǎn)單的WAF或代碼層過濾會(huì)直接str_replace( , )或正則匹配\sunion\s。實(shí)戰(zhàn)場(chǎng)景當(dāng)你的union select被攔截但union/**/select能正常返回時(shí)就應(yīng)該使用它。注意事項(xiàng)它替換所有空白字符。有時(shí)payload里可能有必要的換行符\n也會(huì)被替換這可能破壞某些特定上下文極少見。對(duì)于更嚴(yán)格的過濾/**/本身也可能被列入黑名單。此時(shí)需要嘗試其他替代品如space2plus.py用替換或space2hash.py用#加換行。3.2 randomcase.py隨機(jī)大小寫的迷惑術(shù)這個(gè)腳本通過隨機(jī)化關(guān)鍵字的大小寫來繞過基于大小寫敏感匹配的過濾規(guī)則。#!/usr/bin/env python import random def tamper(payload, **kwargs): def process(match): word match.group(word) return .join(random.choice((c.upper, c.lower))() for c in word) # 對(duì)每個(gè)字符隨機(jī)選擇大寫或小寫 retVal payload if payload: retVal re.sub(r(?i)\b[A-Z_]\b, process, retVal) # (?i)忽略大小寫匹配單詞邊界內(nèi)的純字母/下劃線串 return retVal作用將SELECT可能變?yōu)镾eLeCt、sELecT等使SELECT這個(gè)靜態(tài)簽名失效。實(shí)戰(zhàn)場(chǎng)景適用于那些采用簡(jiǎn)單正則如/select/i進(jìn)行過濾但沒有進(jìn)行規(guī)范化統(tǒng)一轉(zhuǎn)小寫再比較的防御系統(tǒng)。注意事項(xiàng)它只影響“單詞”即被\b邊界包圍的字母串。所以version()中的version會(huì)被變形但括號(hào)不會(huì)。過度隨機(jī)化可能導(dǎo)致payload長(zhǎng)度顯著增加雖然不明顯且每次請(qǐng)求的payload都不同這在某些需要穩(wěn)定payload的盲注場(chǎng)景下可能不是最優(yōu)選擇。重要如果目標(biāo)系統(tǒng)如Oracle對(duì)SQL關(guān)鍵字大小寫敏感通常不但自定義解析器可能使用此腳本會(huì)導(dǎo)致語法錯(cuò)誤。3.3 charencode.py 與 charunicodeencode.py編碼的藝術(shù)這兩個(gè)腳本都涉及編碼轉(zhuǎn)換但目的不同。charencode.py對(duì)payload中未編碼的字符進(jìn)行一次URL編碼%xx格式。union select 1,2-%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%32適用場(chǎng)景某些WAF只解碼一次URL或者對(duì)原始參數(shù)進(jìn)行關(guān)鍵字檢查但對(duì)解碼后的內(nèi)容檢查不嚴(yán)。通過手動(dòng)編碼可以讓關(guān)鍵字“隱形”。注意它使用urllib.quote并設(shè)置safe%意味著%和不會(huì)被二次編碼避免破壞已編碼部分或參數(shù)分隔符。charunicodeencode.py將字符轉(zhuǎn)換為Unicode編碼形式%u0075%u006e...或\u0075\u006e...。union-%u0075%u006e%u0069%u006f%u006e適用場(chǎng)景主要針對(duì)一些ASP/ASP.NET環(huán)境它們可能支持這種Unicode表示法而WAF規(guī)則庫可能遺漏對(duì)此格式的檢查。在現(xiàn)代Web應(yīng)用中效果有限。避坑指南使用編碼類Tamper時(shí)務(wù)必使用-v 3或更高參數(shù)運(yùn)行SQLMap觀察最終發(fā)出的payload。你需要確認(rèn)編碼后的payload在目標(biāo)服務(wù)器的上下文中能被正確解碼。例如如果參數(shù)放在JSON body里URL編碼可能無效如果放在application/x-www-form-urlencoded的POST數(shù)據(jù)中URL編碼是標(biāo)準(zhǔn)操作通常有效。3.4 between.py 與 equaltolike.py操作符的“馬甲”這兩個(gè)腳本針對(duì)的是對(duì)比較操作符,,的過濾。between.py用BETWEEN ... AND ...語法替換和。id 1-id NOT BETWEEN 0 AND 1(邏輯等價(jià)id 1)id 1-id BETWEEN 1 AND 1原理BETWEEN是范圍查詢?cè)谡Z義上可以等價(jià)于比較操作但字符串形式完全不同能繞過簡(jiǎn)單的操作符過濾。限制生成的SQL語句更復(fù)雜可能在某些非常簡(jiǎn)化的SQL解析場(chǎng)景如某些ORM框架拼接的查詢中引發(fā)問題。equaltolike.py將等號(hào)替換為L(zhǎng)IKE。id1-id LIKE 1原理在絕大多數(shù)數(shù)據(jù)庫中當(dāng)比較數(shù)值或簡(jiǎn)單字符串時(shí)和LIKE在沒有通配符的情況下功能是等價(jià)的。但LIKE這個(gè)關(guān)鍵字很少出現(xiàn)在注入攻擊的規(guī)則集中。注意如果比較的是字符串LIKE是大小寫不敏感的取決于數(shù)據(jù)庫配置而可能是大小寫敏感的這可能導(dǎo)致邏輯差異。但在注入探測(cè)中我們通常只關(guān)心“真”和“假”的頁面差異這種細(xì)微差別通常不影響布爾盲注?;A(chǔ)腳本組合策略面對(duì)未知過濾一個(gè)安全的起步組合是--tamper “space2comment,randomcase”。先用space2comment解決空格問題再用randomcase擾亂關(guān)鍵字簽名。如果不行再考慮加入編碼類charencode或操作符替換類between腳本。記住--tamper參數(shù)的腳本順序就是處理順序。4. 高級(jí)繞過技巧腳本組合、定制與WAF對(duì)抗實(shí)戰(zhàn)當(dāng)你用遍了內(nèi)置腳本還是繞不過時(shí)就需要更高級(jí)的策略了。這包括理解WAF的工作原理、巧妙組合現(xiàn)有腳本以及最終手段——自己編寫Tamper腳本。4.1 針對(duì)特定WAF的腳本解析SQLMap內(nèi)置了一些針對(duì)歷史版本或特定品牌WAF的腳本理解它們有助于舉一反三。modsecurityversioned.py / modsecurityzeroversioned.py這兩個(gè)是針對(duì)ModSecurity一個(gè)開源的WAF模塊的。核心技巧是利用MySQL內(nèi)聯(lián)注釋。# modsecurityversioned.py 核心代碼片段 def tamper(payload, **kwargs): retVal payload if payload: postfix for comment in (#, --, /*): if comment in payload: postfix payload[payload.find(comment):] # 保留原注釋 payload payload[:payload.find(comment)] # 去掉原注釋 break # 在關(guān)鍵字前添加 /*!50000*/ retVal re.sub(r(?i)\b(union|select|insert|update|delete|drop|from|where)\b, r/*!50000\1*/, payload) retVal postfix return retVal/*!50000*/是MySQL的特性表示如果數(shù)據(jù)庫版本大于等于5.00.00就執(zhí)行注釋內(nèi)的代碼。對(duì)于WAF它可能被視為普通注釋而忽略但MySQL會(huì)正常解析其中的union、select等關(guān)鍵字。modsecurityzeroversioned.py使用/*!00000*/原理類似。實(shí)戰(zhàn)意義這教會(huì)我們利用數(shù)據(jù)庫特性尤其是MySQL的內(nèi)聯(lián)注釋是繞過WAF語義分析的利器。bluecoat.py這個(gè)腳本做了兩件事1) 在SQL語句后添加隨機(jī)空白符2) 將替換為L(zhǎng)IKE。它模擬了某些特定代理或WAF如BlueCoat SGOS的繞過模式。其價(jià)值在于展示了尾部填充的思路添加無關(guān)內(nèi)容可以干擾某些基于固定長(zhǎng)度或位置簽名的檢測(cè)。4.2 腳本組合的進(jìn)階策略與順序考量Tamper腳本的順序至關(guān)重要因?yàn)榍耙粋€(gè)腳本的輸出是后一個(gè)腳本的輸入。錯(cuò)誤示例--tamper “charencode,space2comment”你先對(duì)整個(gè)payload進(jìn)行了URL編碼空格變成了%20。然后space2comment腳本尋找的是空格字符 找不到%20所以替換無效。最終payload里依然是%20而不是/**/。正確順序--tamper “space2comment,charencode”先把空格變成/**/然后再對(duì)整個(gè)字符串進(jìn)行URL編碼/**/被編碼為%2f%2a%2a%2f。這樣既繞過了空格過濾又通過了可能的關(guān)鍵字檢查。一個(gè)針對(duì)較強(qiáng)過濾的通用組合思路結(jié)構(gòu)破壞randomcomments.py- 在關(guān)鍵字之間插入隨機(jī)注釋破壞union select這樣的連續(xù)簽名。關(guān)鍵字變形randomcase.py或versionedkeywords.py- 改變關(guān)鍵字本身的形式。空格處理space2comment.py或space2plus.py- 處理剩余的空格。最終編碼charencode.py- 對(duì)整個(gè)payload進(jìn)行一次“化妝”。你可以這樣使用--tamper “randomcomments,randomcase,space2comment,charencode”。使用-v 3觀察最終payload看是否符合預(yù)期。4.3 手把手編寫自定義Tamper腳本當(dāng)內(nèi)置腳本全部失效或者遇到非常獨(dú)特的過濾規(guī)則時(shí)自己寫Tamper腳本是終極解決方案。一個(gè)Tamper腳本就是一個(gè)Python文件放在SQLMap的tamper/目錄下即可被識(shí)別。編寫步驟與模板創(chuàng)建文件在tamper目錄下新建一個(gè).py文件例如my_bypass.py。編寫函數(shù)文件必須包含一個(gè)名為tamper的函數(shù)。實(shí)現(xiàn)邏輯在函數(shù)內(nèi)對(duì)payload字符串進(jìn)行操作。添加依賴如果需要可以導(dǎo)入re正則、random等庫。下面是一個(gè)實(shí)戰(zhàn)案例假設(shè)目標(biāo)網(wǎng)站過濾了select關(guān)鍵字但不過濾selselectect即采用簡(jiǎn)單的str_replace(‘select’, ‘’)過濾我們可以用雙寫繞過。#!/usr/bin/env python Copyright (c) 2006-2024 sqlmap developers (http://sqlmap.org/) See the file LICENSE for copying permission import re from lib.core.enums import PRIORITY __priority__ PRIORITY.NORMAL # 定義腳本優(yōu)先級(jí)NORMAL即可 def dependencies(): pass # 這里可以聲明依賴關(guān)系通常為空 def tamper(payload, **kwargs): 雙寫繞過簡(jiǎn)單字符串替換過濾 例如select - selselectect替換后變成 select retVal payload if payload: # 定義要雙寫的關(guān)鍵字列表 keywords [select, union, from, where, or, and, insert, update, delete, drop, table] for keyword in keywords: # 使用正則忽略大小寫進(jìn)行替換 # 注意替換模式是 ‘s’ - ‘selsect’‘e’-‘seleect’... 我們采用簡(jiǎn)單方法在關(guān)鍵字中間插入自身 # 更健壯的做法將 ‘select’ 替換為 ‘sel’ ‘select’ ‘ect’ if keyword.lower() in payload.lower(): # 粗略檢查是否存在 # 構(gòu)造雙寫后的字符串將 ‘select’ 變成 ‘sel’ ‘select’ ‘ect’ doubled keyword[:len(keyword)//2] keyword keyword[len(keyword)//2:] # 使用正則進(jìn)行不區(qū)分大小寫的替換 retVal re.sub(r(?i)\b re.escape(keyword) r\b, doubled, retVal) return retVal代碼解析__priority__腳本執(zhí)行的優(yōu)先級(jí)。當(dāng)多個(gè)腳本對(duì)同一部分進(jìn)行修改時(shí)優(yōu)先級(jí)高的后執(zhí)行覆蓋前面的。一般保持NORMAL。dependencies()用于聲明此腳本運(yùn)行所需的其他腳本通常不需要。tamper(payload, **kwargs)核心函數(shù)。payload是SQLMap傳來的原始payload字符串。我們返回修改后的字符串。邏輯遍歷預(yù)定義的關(guān)鍵字列表檢查payload中是否存在忽略大小寫。如果存在則將其替換為“雙寫”版本。例如select被替換為selselectect。當(dāng)目標(biāo)系統(tǒng)執(zhí)行str_replace(‘select’, ‘’, $input)后中間的select被移除兩邊的sel和ect又拼接成了select從而繞過過濾。測(cè)試你的腳本將腳本放入tamper/目錄。使用SQLMap的-t參數(shù)指定一個(gè)臨時(shí)文件來觀察payload變化sqlmap -u “http://test.com?id1” –tamper “my_bypass” -v 3 –flush-session。查看輸出中[PAYLOAD]部分確認(rèn)變形是否符合預(yù)期。在安全的測(cè)試環(huán)境如DVWA、SQLi-Labs中配置相應(yīng)的過濾規(guī)則進(jìn)行實(shí)戰(zhàn)測(cè)試。高級(jí)技巧利用kwargstamper函數(shù)接收**kwargs其中包含一些有用的上下文信息例如kwargs.get(‘headers’, {})可以獲取HTTP頭。你可以編寫根據(jù)Content-Type或User-Agent動(dòng)態(tài)調(diào)整變形策略的智能腳本。例如當(dāng)Content-Type為application/json時(shí)可能需要對(duì)payload進(jìn)行JSON字符串轉(zhuǎn)義。5. 實(shí)戰(zhàn)問題排查與Tamper腳本調(diào)試技巧即使掌握了所有腳本實(shí)戰(zhàn)中依然會(huì)碰壁。本章節(jié)匯總了常見問題及其排查思路。5.1 常見失敗場(chǎng)景分析與解決思路問題現(xiàn)象可能原因排查步驟與解決方案使用Tamper后SQLMap報(bào)告“所有參數(shù)似乎都不注入”1. Tamper腳本破壞了payload語法。2. 變形后的payload觸發(fā)了更嚴(yán)格的WAF規(guī)則。3. 目標(biāo)參數(shù)本身不存在注入點(diǎn)。1.使用-v 3或-v 4這是最重要的步驟。仔細(xì)觀察[PAYLOAD]和[HTTP請(qǐng)求]部分看最終發(fā)出的SQL語句是什么。它是否還是一條合法的SQL2.簡(jiǎn)化Tamper先只用一個(gè)最基本的腳本如space2comment測(cè)試逐步增加。3.手動(dòng)驗(yàn)證將-v 3看到的payload手工復(fù)制到Burp Suite Repeater中發(fā)送觀察服務(wù)器響應(yīng)。確認(rèn)是WAF攔截返回403等還是SQL語法錯(cuò)誤返回500或數(shù)據(jù)庫報(bào)錯(cuò)。4.檢查腳本順序確保編碼類腳本在最后。注入能檢測(cè)到但無法提取數(shù)據(jù)如--dbs失敗1. 某些關(guān)鍵函數(shù)或語句被過濾如select,from,information_schema。2. Tamper腳本在數(shù)據(jù)提取階段未生效或生效方式不對(duì)。1.分階段測(cè)試分別測(cè)試布爾盲注(--techniqueB)、時(shí)間盲注(--techniqueT)、報(bào)錯(cuò)注入(--techniqueE)??赡苣撤N技術(shù)能繞過。2.使用--prefix和--suffix手動(dòng)指定注入點(diǎn)前后綴有時(shí)可以繞過對(duì)特定上下文語法的過濾。3.檢查WAF識(shí)別使用--identify-waf更準(zhǔn)確地識(shí)別WAF然后查找針對(duì)該WAF的特定Tamper或技巧。4.嘗試--level和--risk提高檢測(cè)等級(jí)(--level 3)和風(fēng)險(xiǎn)等級(jí)(--risk 3)SQLMap會(huì)使用更多、更“冒險(xiǎn)”的payload和Tamper組合。同一個(gè)Tamper腳本有時(shí)成功有時(shí)失敗1. WAF可能有動(dòng)態(tài)規(guī)則或?qū)W習(xí)模式。2. 腳本中使用了隨機(jī)化如randomcase導(dǎo)致某些變形恰好被規(guī)則命中。3. 服務(wù)器有速率限制或IP臨時(shí)封鎖。1.降低請(qǐng)求頻率使用--delay 1每秒1請(qǐng)求和--timeout 30。2.使用代理池通過--proxy或--proxy-file輪換IP。3.禁用隨機(jī)化如果懷疑是randomcase導(dǎo)致?lián)Q用確定性的變形腳本如versionedkeywords。4.觀察WAF日志模式如果可能在測(cè)試環(huán)境分析WAF日志看它到底攔截了哪些特征。自定義腳本不生效1. 腳本未放在正確的tamper/目錄。2. 腳本語法錯(cuò)誤。3. 函數(shù)名不是tamper或優(yōu)先級(jí)__priority__設(shè)置有問題。4. SQLMap緩存了之前的測(cè)試結(jié)果。1.檢查路徑確保腳本在SQLMap根目錄的tamper/文件夾內(nèi)。2.Python語法檢查在命令行運(yùn)行python -m py_compile your_script.py檢查錯(cuò)誤。3.使用--flush-session清除緩存強(qiáng)制SQLMap重新開始測(cè)試。4.在腳本開頭加print語句調(diào)試臨時(shí)在tamper函數(shù)第一行添加print(“My script is called with:”, payload)運(yùn)行SQLMap時(shí)觀察控制臺(tái)輸出。5.2 高效調(diào)試與信息收集方法論必用參數(shù)-v 3這是調(diào)試Tamper的“眼睛”。它顯示每一個(gè)測(cè)試payload的變形前和變形后狀態(tài)。結(jié)合Burp Suite將SQLMap的代理設(shè)置為Burp (--proxyhttp://127.0.0.1:8080)。在Burp中觀察所有請(qǐng)求和響應(yīng)。重點(diǎn)關(guān)注被WAF攔截返回403、419等狀態(tài)碼或有特定攔截頁面的請(qǐng)求。對(duì)比攔截請(qǐng)求和成功請(qǐng)求的payload差異能精準(zhǔn)定位觸發(fā)規(guī)則的“壞字符”或“壞模式”。使用--test-filter如果你懷疑某個(gè)特定的payload類型如的比較被過濾可以用--test-filter只測(cè)試包含該字符的payload快速驗(yàn)證。利用--string或--not-string在盲注中指定一個(gè)在真/假條件下會(huì)穩(wěn)定出現(xiàn)在頁面中的字符串可以幫助SQLMap更準(zhǔn)確地判斷減少因WAF干擾導(dǎo)致的誤判。離線分析模式使用-l參數(shù)從Burp Suite保存的日志文件中讀取目標(biāo)可以避免頻繁觸發(fā)WAF的IP封鎖同時(shí)仔細(xì)分析每個(gè)請(qǐng)求。5.3 超越Tamper當(dāng)腳本也無力時(shí)Tamper腳本主要處理payload本身。如果WAF的防御層次更高可能需要結(jié)合其他技巧HTTP參數(shù)污染HPP?id1id2不同的服務(wù)器端語言會(huì)以不同方式解析可能繞過參數(shù)檢查。SQLMap的-prefix和-suffix可以模擬?;蜨TTP請(qǐng)求修改Content-Type、使用GET傳遞POST數(shù)據(jù)、分塊傳輸編碼等。這需要修改SQLMap的lib/request/相關(guān)代碼或使用其他工具配合。資源限制繞過如果WAF有請(qǐng)求大小限制可以嘗試使用非常長(zhǎng)的參數(shù)值或者將payload拆分到多個(gè)參數(shù)如Cookie、Header中。時(shí)序攻擊對(duì)于時(shí)間盲注精心設(shè)計(jì)SLEEP函數(shù)使其延遲時(shí)間不規(guī)則避開基于固定延時(shí)閾值的檢測(cè)。最終SQL注入與WAF的對(duì)抗是道高一尺魔高一丈的持續(xù)過程。Tamper腳本是自動(dòng)化工具中的重要一環(huán)但真正的突破往往來自于對(duì)目標(biāo)系統(tǒng)、數(shù)據(jù)庫特性、WAF規(guī)則乃至HTTP協(xié)議的深刻理解。保持學(xué)習(xí)手動(dòng)測(cè)試分析流量你才能從腳本的使用者成長(zhǎng)為繞過規(guī)則的創(chuàng)造者。