淺談multipart協議 WAF繞過技巧 圖文 黑客

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模式。

相關文章
相關標籤/搜索