淺談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模式。
※智庫報告:英國「三叉戟」核潛艇系統存在網路安全隱患易受網路攻擊
※【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 挑戰賽科研思路淺談