Sql注入waf過濾機制及繞過姿式

  在進行sql注入測試中總會遇到各類廠商的waf,本篇文章將對waf的過濾機制,以及常見的繞過方法進行介紹,但願在之後的測試中會對你們有所幫助。php


0x01 WAF的過濾機制正則表達式

   WAF全稱網站應用級***防護系統是Web Application Firewall的簡稱,主要有如下四個功能:
1. 審計設備--用來截獲全部HTTP數據或者僅僅知足某些規則的會話 ;
2. 訪問控制設備--用來控制對Web應用的訪問既包括主動安全模式和被動安全模式 ;
3. 架構/網絡設計工具--運行在反向代理模式用來分配職能集中控制虛擬基礎結構等;
4. WEB應用加固工具--加強被保護Web應用的安全性它不只可以屏蔽WEB應用固有弱點並且可以保護WEB應用編程錯誤致使的安全隱患等。
sql


   WAF主要有如下過濾機制:
1.異常檢測協議--拒毫不符合HTTP標準的請求;
2.加強的輸入驗證--代理和服務端的驗證而不僅是限於客戶端驗證;
3.白名單&黑名單機制--白名單適用於穩定的Web應用,黑名單適合處理已知問題;
4.基於規則和基於異常的保護--基於規則更多的依賴黑名單機制基於,基於異常根據系統異常更爲靈活;
5.另外還有會話保護、Cookies保護、抗***規避技術、響應監視和信息泄露保護等。
數據庫


0x02 WAF的繞過姿式


一、大小寫繞過express

大小寫繞過用於只針對小寫或大寫的關鍵字匹配技術。正則表達式/express/i 匹配時大小寫不敏感便沒法繞過這是最簡單的繞過技術,不過如今直接使用這種繞過技術成功的可能性已經不高了。
http://www.xx.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
編程


二、替換關鍵字瀏覽器

這種狀況下大小寫轉化沒法繞過並且正則表達式會替換或刪除select、union這些關鍵字若是隻匹配一次就很容易繞過
http://www.xx.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
替換關鍵字一樣是很基礎的技術也能夠構造得更復雜SeLSeselectleCTecT關鍵要看正則表達式會進行幾回匹配處理了。
安全


三、編碼繞過服務器

(1)url編碼繞過
瀏覽器會對連接的非保留字字符進行URL編碼,如空格變爲%20、單引號%2七、左括號%2八、右括號%29,普通的URL編碼可能沒法實現繞過,不過存在某種狀況URL編碼只進行了一次解碼過濾可使用兩次編碼繞過。
test.php?id=1%252f%252a*/UNION%252f%252a/SELECT
網絡


(2)十六進制編碼繞過
使用16進制對某些敏感參數、方法等進行編碼來繞過waf的檢測.
http://www.xx.com/index.php?page_id=-15/*!u%6eion*//*!se%6cect*/1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

示例代碼中前面是對單個字符十六進制編碼,後面則是對整個字符串編碼。


(3)Unicode編碼繞過
Unicode有所謂的標準編碼和非標準編碼假設咱們用的utf-8爲標準編碼那麼西歐語系所使用的就是非標準編碼了


下面是經常使用的幾個符號的一些Unicode編碼:


繞過舉例:

示例中前者利用雙字節繞過,好比對單引號轉義操做變成\',那麼就變成了%D6%5C',%D6%5C構成了一個寬字節即Unicode字節,轉義符號直接被吃掉,單引號就能夠正常使用了;第二個示例使用的是兩種不一樣編碼的字符的比較,它們比較的結果多是True或者False,關鍵在於Unicode編碼種類繁多,基於黑名單的過濾器存在沒法處理的狀況,從而實現繞過。


四、使用註釋繞過

首先看一下常見的用於註釋的符號:


(1)普通註釋繞過
使用/**/在構造的查詢語句中插入註釋來規避對空格的依賴或關鍵字識別,#、--用於終結語句的查詢。
http://www.xx.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4 'union%a0select pass from users#


(2)內聯註釋繞過
相比普通註釋內聯註釋用的更多,/!content/只有MySQL會正常識別content的內容。

兩個示例中前者使用內聯註釋後者還用到了普通註釋。


五、等價函數字符替換繞過

在測試中有些函數、命令或特殊符號因其關鍵字被檢測出來而沒法使用可是在不少狀況下可使用與之等價或相似的代碼替代其使用。


(1)等價函數


舉例substring()和substr()沒法使用時:


或者:


上述這幾個示例用於說明有時候當某個函數不能使用時還能夠找到其餘的函數替代其實現


(2)等價符號
and和or不能使用能夠嘗試下&&和||,還有=不能使用的狀況能夠考慮嘗試<、>由於若是不小於又不大於那即是等於。
不少的空格可使用以下符號代替其使用:


(3)生僻函數
各種數據庫都有許多本身獨有的函數和方法,WAF要想所有涵蓋實際上不大可能,在某些狀況下能夠嘗試一下生僻函數進行繞過。例如MySQL/PostgreSQL支持的XML函數:


六、使用特殊符號繞過

常用的特殊符號:
1.使用反引號`,例如select `version()`,能夠用來過空格和正則,特殊狀況下還能夠將其作註釋符用 ;
2.神奇的"-+.",select+id-1+1.from users; 「+」是用於字符串鏈接的,」-」和」.」在此也用於鏈接,能夠逃過空格和關鍵字過濾 ;
3.@符號,select@^1.from users; @用於變量定義如@var_name,一個@表示用戶定義,@@表示系統變量 ;
4.Mysql function() as xxx 也可不用as和空格   select-count(id)test from users; //繞過空格限制;
5.若是匹配sql注入的正則表達式中使用了多行匹配模式則可使用%0a換行符進行繞過。
使用這些字符的能作不少事,下面是一些示例:
關鍵字拆分:

!和()' or --+2=- -!!!'2:

最後再給出一些和這些字符多少有點關係的操做符供參考

使用這些"特殊符號"實現繞過是一件很細微的事情,一方面各數據庫對符號的處理是不盡相同,另外一方面你得充分了解這些符號的特性和使用方法才能會考慮利用其實現繞過。


七、使用語言服務自身的特性繞過

(1)HPP(HTTP Parameter Polution)
舉例:
/?id=1;select+1&id=2,3+from+users+where+id=1
/?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
HPP又稱作重複參數污染最簡單的就是?uid=1&uid=2&uid=3對於這種狀況不一樣的Web服務器處理方式以下

具體WAF如何處理要看其設置的規則,不過就示例中最後一個來看有較大可能繞過。

(2)HPF(HTTP Parameter Fragment)
這種方法是HTTP分割注入同CRLF略有類似之處(使用控制字符%0a、%0d等換行)。
舉例:
/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users
看完上面兩個示例發現和HPP最後一個示例很像,不一樣之處在於參數不同,這裏是在不一樣的參數之間進行分割結果到了數據庫執行查詢時再合併語句。

(3)HPC(HTTP Parameter Contamination)
這一律念見於Beyond SQLi: Obfuscate and Bypass這裏Contamination意爲污染。


RFC2396定義了以下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' () 
Reserved : ; / ? : @ & = + $ , 
Unwise : { } | \ ^ [ ] `


不一樣的Web服務器處理處理構造得特殊請求時有不一樣的邏輯


以魔術字符%爲例Asp/Asp.net會受到影響 :


0x03 總結


       在實際狀況中,各類單一的繞過技術可能沒法繞過過濾機制,可是有時多種技術的配合使用成功的可能性就會增長很多了。本文中暫時先列舉出這幾種比較常見的繞過姿式供你們參考。


原文:https://security.yirendai.com/news/share/15

相關文章
相關標籤/搜索