當前位置:
首頁 > 最新 > 淺談WAF繞過技巧

淺談WAF繞過技巧

waf分類

掌握繞過各類WAF可以說是滲透測試人員的一項基本技能,本文將WAF分為雲WAF、硬體WAF、軟體WAF、代碼級WAF,分別從各自的特性來談一些相關的繞過技巧,更側重於針對基於規則類的WAF繞過技巧。

雲waf

Eg:加速樂

目前CDN服務的功能是越來越多,安全性也越加強悍,用戶的每個請求都會被發送到指定的CDN節點上,最後轉發給真實站點。這個過程就好像加了一道關卡,這個關卡提供了緩存、加速、防禦的特點。

繞過關鍵:查詢真實IP,若是直接訪問伺服器的IP就不經過CDN了。

以下四點有助於繞過:

1.查詢歷史DNS(在2016年加入到了cnd節點裡面,可以通過查詢2016年之前的dns記錄)

2.查看子域名解析地址是否和主域名的IP地址相近。(有些網站只會講主站加入到CDN節點裡面,這時可以查看其二級、三級域名的IP地址信息,進而猜到主站的IP地址)

3.CDN節點分發缺陷,通過國外IP訪問網站可能會出現真實IP,因為有的CDN服務商可能只做了國內節點,沒做國外的,這樣訪問請求是直接被轉發到真實伺服器地址上。

4.讓伺服器主動連接你。比如rss訂閱服務或則是向郵箱伺服器發送個錯誤的郵件比如地址不存在 通過抓包觀察返回的頭來,查找IP地址信息。

硬體waf

Eg:綠盟WAF

軟體waf

Eg:安全狗

基於規則的WAF工作原理:

數據獲取(注意 get post等方法以及 post體方式)———數據清洗(去除多餘數據比如編碼,mssql支持unicode編碼)———規則匹配———二次校驗

一.繞注入

1.關鍵字替換

原理:部分WAF是通過黑名單來起到攔截的作用,這種情況可以用關鍵字替換來實現繞過。比如在mysql中,waf將sleep()函數列入了黑名單,可以通過具備相同功能的benchmark()函數來實現繞過。以下是部分相同功能的替代函數:

< > 等價於 BETWEEN

= 等價於 like

Hex() bin() 等價於ascii()

Sleep() 等價於 benchmark()

Mid()substring() 等價於 substr()

@@user 等價於 User()

@@Version 等價於 version()

(mysql支持&& ,oracle不支持 && )

2.特殊符號

原理:結合不同資料庫的特性來實現繞過。(最好是可以找到waf開發者都不了解的某些特性),以下是兩個廣為流傳的小特性:

比如 「+」 select+password+from+mysql.user 相當於是一個空格的作用

「`」放在mysql的末尾會起到注釋符的作用

3.編碼

可以結合各種編碼方式來繞過,比如url編碼,url雙重編碼,十六進位編碼,unicode編碼,資料庫編碼等。

舉個栗子:mysql默認的字符集是latin,因此在php代碼裡面設置的字符集為 utf-8,這只是客戶端的字符集,因此存在字符集裝換的問題utf-8—>latin,若傳進來的字符集不是完整的字元,則會導致不完整的字元自動會忽略的問題,比如username=admin%c2 , 由於%c2不是一個完整的utf-8字元 因此傳到Mysql 裡面 自動忽略了,導致查出的是admin用戶的數據,可以利用這個特性繞過。

4.注釋符

/*xxx*/是注釋,也可以充當空白符。因為 /**/可使得MySQL對sql語句(union/**/select)詞法解析成功。事實上許多WAF都考慮到/**/可以作為空白分,但是waf檢測 「/*.**/」很消耗性能,工程師會折中,可能在檢測中間引入一些特殊字元,例如:/*w+*/。或者,WAF可能只中間檢查n個字元「/*.{,n}*/」。根據以上想法,可以逐步測試繞過方法:

先測試最基本的:union/**/select再測試中間引入特殊字:union/*aaaa%01bbs*/select最後測試注釋長度:

union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select

5.空白符繞過

基於正則表達式的WAF, SQL注入規則使用正則表達式的「s」匹配空格,例如」selects+union」。

利用空白符進行繞過,測試WAF時儘可能減少其他原因的影響,例如」union select」被攔截,只需把中間空白符替換為」%250C」, 「%25A0」進行繞過測試。

union%250Cselect

union%25A0select

函數分隔符對基於正則表達式的WAF,我們猜測安全工程師寫WAF規則時,可能不知道函數名與左括弧之間可以存在特殊字元,或者遺漏可以存在特殊字元。例如匹配函數」concat()」的規則寫法,「concat(」或者」concats*(」,就沒有考慮到一些特殊字元。

concat%2520(

concat/**/(

concat%250c(

concat%25a0(

6.浮點數詞法解析

利用MySQL解析浮點數的特點,正則表達式無法匹配出單詞union,但是MySQL詞法解析成功解析出浮點數、sql關鍵字union。

select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0

select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0

7.報錯注入

Error-based的SQL注入函數非常容易被忽略,導致WAF規則過濾不完整。常見的函數:

extractvalue(1, concat(0x5c,md5(3)));

updatexml(1, concat(0x5d,md5(3)),1);

GeometryCollection((select*from(select*from(select@@version)f)x))

polygon((select*from(select name_const(version(),1))x))

linestring()

multipoint()

multilinestring()

multipolygon()

二.繞上傳

關鍵是:waf與webserver的差異(waf的局限性與webserver的靈活性)。

1.協議解析不一致-文件名解析兼容性

multipart協議中,文件名的形式為「filename=」abc.php」」。但是Tomcat、PHP等容器解析協議時會做一些兼容,能正確解析 」filename=」abc.php」、」filename=abc.php」、 」filename=』abc.php』」。而WAF只按照協議標準去解析,無法解析文件名,但是後端容器能正確獲得文件名,從而導致被繞過。場景的繞過形式:

Content-Disposition: form-data; name=」file」; filename=bc.php

Content-Disposition: form-data; name=」file」; filename=」abc.php

Content-Disposition: form-data; name=」file」; filename=』abc.php』

2.協議解析不正確-未解析所有文件

multipart協議中,一個POST請求可以同時上傳多個文件。如圖,許多WAF只檢查第一個上傳文件,沒有檢查上傳的所有文件,而實際後端容器會解析所有上傳的文件名,攻擊者只需把paylaod放在後面的文件PART,即可繞過。

3.協議解析不正確-文件名覆蓋

在multipart協議中,一個文件上傳塊存在多個Content-Disposition,將以最後一個Content-Disposition的filename值作為上傳的文件名。許多WAF解析到第一個Content-Disposition就認為協議解析完畢,獲得上傳的文件名,從而導致被繞過。如圖,加速樂的WAF解析得到文件名是」sp.pho」,但PHP解析結果是」sp.php」,導致被繞過。

4.變換位置

因為WebServer獲取參數的靈活性,所以我嘗試把安全狗攔截的filename=」test.asp」換個位置。經過一番測試,發現filename=」test.asp」位於Content-Type: application/octet-stream

下一行時,安全狗的上傳攔截便會失效。

5.文件名覆蓋

在一個Content-Disposition 中,存在多個filename ,協議解析應該使用最後的filename值作為文件名。如果WAF解析到filename=」p3.txt」認為解析到文件名,結束解析,將導致被繞過。因為後端容器解析到的文件名是t3.jsp。

Content-Disposition: form-data;name=」myfile」; filename=」p3.txt」;filename=」t3.jsp」》

6.遺漏文件名

當WAF遇到「name=」myfile」;;」時,認為沒有解析到filename。而後端容器繼續解析到的文件名是t3.jsp,導致WAF被繞過。

《Content-Disposition: form-data;name=」myfile」;; filename=」t3.jsp」》

7.任意文件下載

(1)相對路徑:所以WAF文件包含規則通常會檢測連續的「../」。根據vfs解析路徑的語法,解析到「//」文件路徑不變,解析到「/./」文件路徑依然。 通過避免連續的」../」,從而繞過WAF文件包含規則。Eg: ././..///./.././/../etc//passwd,它等價於../../../etc/passwd。

(2)絕對路徑:例如 /etc/./passwd 與 /etc/passwd 是等價的。還可以通過組合「/./」、「//」進行繞過,

Eg.

/etc///.//././/passwd

/etc/passwd /etc././././passwd

代碼級waf

所謂代碼級的WAF是指程序員在程序內部,藉助自身編寫的過濾函數來保護應用程序的安全。以下是三種腳本語言通常會使用的過濾位置:

1. php

在php.ini中設置

; Automatically add files before PHP document.; auto-prepend-fileauto_prepend_file =; Automatically add files after PHP document.; auto-append-fileauto_append_file =

配置指令,這些指令指向那些在每個請求的PHP腳本執行」之前」和」之後」才執行的PHP文件。這樣就可以在各種HTTP請求集合(GET,POST,COOKIE)之前對數據進行一些前發處理。

2.asp.net

通過ASP.NET的System.Web.IHttpModule介面來實現

3.java

通過filter來實現。比如tomcat會在web.xml的配置文件中配置過濾類。

繞過基於規則的WAF

目前市面的大部分WAF是通過規則來實現的,既然是規則,就一定存在不全面、不準確的情況。下面舉幾個例子幫助大家拓展一下思路:

1.封禁IP

比如有些waf會對重複的IP訪問進行封鎖,這時可以用在請求包體中加入 「X-Originating-IP:127.0.0.1」,因為waf不會攔截他自己。

2.前端waf

針對於前端的waf,可以直接通過burp抓包繞過

3.改變user-agent

我們在寫網站防火牆規則的時候可能都會做一件事:永遠不屏蔽那些主流搜索引擎機器人的爬取(如,Google,Bing,Yahoo,Baidu等).這時我們就可以在USER-Agent偽造自己是搜索引擎的爬蟲,繞過waf.

4.緩衝區溢出

比如waf只允許長度是2M的包體,而伺服器則可以接受8M的包體,這種情況 可以通過發送2M-8M的包體將WAF溢出死。

5.替換關鍵字

需要考慮waf具體怎麼攔截的,Seleselectct,倘若將中間的關鍵字刪掉,則可以繞過。

6.webserver特性

iis 自動忽略%

我們知道asp有兩個特性

1.會將Request中的不能編碼部分的%去掉

2.Request中如果有unicode部分會將其進行解碼

IIS6.0兩個解析缺陷:目錄名包含.asp、.asa、.cer的話,則該目錄下的所有文件都將按照asp解析。

Apache1.X 2.X解析漏洞:

Apache在以上版本中,解析文件名的方式是從後向前識別擴展名,直到遇見Apache可識別的擴展名為止。

Nginx解析漏洞:

Nginx 0.8.41 – 1.5.6:以上Nginx容器的版本下,上傳一個在waf白名單之內擴展名的文件shell.jpg,然後以shell.jpg%20.php進行請求。

PHP CGI解析漏洞 : IIS 7.0/7.5 和 Nginx < 0.8.3 以上的容器版本中默認php配置文件cgi.fix_pathinfo=1時,上傳一個存在於白名單的擴展名文件shell.jpg,在請求時以shell.jpg/shell.php請求,會將shell.jpg以php來解析。

7.資料庫特性

mysql:

1.隱形類型轉換

2.為了便利性 犧牲安全性。(select * from admin where user=「Admin」 可以執行, mysql為了 使用的便利性 會允許一些 『錯誤』,比如 select * from admin where user=「àdmin」 依然可移執行。

3.MySQL文件讀取

(5.5以上的版本 由於secure_file_priv這個變數為null 因此無法使用文件讀取 文件寫入的功能。)

8.伺服器特性

Windows特殊字元:當我們上傳一個文件的filename為shell.php{%80-%99}時:waf可能識別為.php{%80-%99},就會導致被繞過。

NTFS ADS特性:ADS是NTFS磁碟格式的一個特性,用於NTFS交換數據流。在上傳文件時,如果waf對請求正文的filename匹配不當的話可能會導致繞過。

Windows在創建文件時,在文件名末尾不管加多少點都會自動去除,那麼上傳時filename可以這麼寫shell.php……也可以這麼寫shell.php::$DATA…….。

總結:本文主要對基於規則的WAF的繞過技巧,基於規則的waf有著天然的缺陷型,構造出基於規則之外的特性就有可能繞過。或者乾脆將WAF直接打掛,這時waf很有可能直接啟用Bypass模式。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

智庫報告:英國「三叉戟」核潛艇系統存在網路安全隱患易受網路攻擊
【FB TV】一周「BUF大事件」:《網路安全法》開始施行;首屆TCTF線下決賽火熱進行;Fireball全球肆虐
如何在macOS上監聽單個應用HTTPS流量
MSF外網持久控制Android手機並滲透測試區域網
無需宏,PPT也能用來投遞惡意程序

TAG:FreeBuf |

您可能感興趣

淺談MySQL分散式中間件MYCAT
淺談RF電路設計
淺談我對OKR的理解
頻段和信號那些事:淺談LTE的MIMO多天線技術
淺談利用SIMeID應對「GSM劫持+簡訊嗅探」新型偽基站詐騙
淺談HTTP在WebApi開發中的運用
淺談魅族的Flyme的藍牙切換WIFI高速傳輸技術
《DOTA2》淺談OpenAI在DOTA2的發展過程
升級ONE UI後再淺談SAMSUNG S9手機
淺談:魔卡少女櫻CLEAR CARD篇
M.2一定比SATA快?淺談選購SSD容易走進的誤區
淺談WKWebView使用、JS的交互
淺談BIM一—BIM應用與當年CAD甩圖板對比
淺談VR、AR、MR
淺談動態跟蹤技術之DTrace
淺談神威樂步六次上NICONICO超PARTY的變化,男神穿什麼都好看!
淺談遊戲DLC
在線高清音頻體驗與研究「一」淺談MQA編碼的技術與商業模式「Soomal」
淺談蘋果車載系統CarPlay
RoboMaster AI 挑戰賽科研思路淺談