http://mp.sohu.com/profile?xpt=ZnJlZWJ1ZkBzb2h1LmNvbQ==&_f=index_pagemp_1php
af分類前端
掌握繞過各種WAF能夠說是滲透測試人員的一項基本技能,本文將WAF分爲雲WAF、硬件WAF、軟件WAF、代碼級WAF,分別從各自的特性來談一些相關的繞過技巧,更側重於針對基於規則類的WAF繞過技巧。java
雲wafmysql
Eg:加速樂程序員
目前CDN服務的功能是愈來愈多,安全性也越增強悍,用戶的每一個請求都會被髮送到指定的CDN節點上,最後轉發給真實站點。這個過程就好像加了一道關卡,這個關卡提供了緩存、加速、防護的特色。web
繞過關鍵:查詢真實IP,如果直接訪問服務器的IP就不通過CDN了。正則表達式
如下四點有助於繞過:sql
1.查詢歷史DNS(在2016年加入到了cnd節點裏面,能夠經過查詢2016年以前的dns記錄)shell
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.5.*Nginx 0.6.*Nginx 0.7 <= 0.7.65Nginx 0.8 <= 0.8.37,以上Nginx容器的版本下,上傳一個在waf白名單以內擴展名的文件shell.jpg,而後以shell.jpg.php進行請求。
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來解析。
參數污染:好比waf只接受前一個參數這意味着,經過注入: id=7&id=[SQLi]WAF的網絡層會解析 id=7 ,合法PHP應用層會解析 id=[SQLi] 注入語句成功執行
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模式。