Web Application Firewall 的常見偵測原理
這篇文章主要討論 WAF (Web Application Firewall ) 的偵測與防護基本原理
1. 正規化
由於黑客會利用各種編碼的方式繞過驗證或是檢查,
所以 WAF 必須將原始 Http Request 的數據內容進行正規化
所謂的正規化就是將原始資料”轉化”為對於 WAF 無害的資料格式, 正規化主要目的為:
- 資料格式轉換, 對 WAF 無害
- 資料格式轉換, 讓 WAF 可以容易用規則判斷
常見的正規化資料格式轉換有:
- 大小寫
- URL 編碼
- Null Byte 結尾
- /./ 或是 /../的使用
- 空白字元
- 註釋
- // 與 \\ 的轉換
- 特殊意義字元 \t \001等
2. 黑名單 IP
如果來源的 IP 位址是已知的黑客或是危險的用戶端, 可以直接中斷該連線請求
下列是業界比較知名黑名單 IP 的來源
- https://check.torproject.org/exit-addresses
- https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt
- https://www.spamhaus.org/drop/drop.txt
- https://www.spamhaus.org/drop/
- http://www.projecthoneypot.org/list_of_ips.php
- https://github.com/botherder/targetedthreats
- https://otx.alienvault.com
3. 程式語言錯誤訊息
當網站沒有適當的錯誤處理時,
回傳過多的程式異常訊息會導致黑客利用該訊息對於後端程式解析進行攻擊,
SQL injection 就是常見的一種攻擊方式
每種程式語言與資料庫回傳的錯誤訊息都不同,
WAF 會偵測到這些回傳錯誤訊息並且進行過濾, 進一步判斷是否為某個來源用戶端造成的錯誤, 對於該用戶端進行阻攔
4. 合法的Method
常見的 Method 包含 HTTP post, get, put等
如果可以針對存取資源所開放的 http method 來做白名單 WAF設定會讓偵測更加準確
白名單相對缺點是耗時且每次更新都要重新檢視, 當服務多的時候白名單的維護也是一個問題
常見的WAF黑名單配置是 HTTP HEAD 與 HTTP Options 這兩個 mehtods, 因為對外開放容易導致透露過多訊息外露,
HTTP Verb | CRUD | Entire Collection (e.g. /customers) | Specific Item (e.g. /customers/{id}) |
---|---|---|---|
POST | Create | 201 (Created), ‘Location’ header with link to /customers/{id} containing new ID. | 404 (Not Found), 409 (Conflict) if resource already exists.. |
GET | Read | 200 (OK), list of customers. Use pagination, sorting and filtering to navigate big lists. | 200 (OK), single customer. 404 (Not Found), if ID not found or invalid. |
PUT | Update/Replace | 405 (Method Not Allowed), unless you want to update/replace every resource in the entire collection. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. |
PATCH | Update/Modify | 405 (Method Not Allowed), unless you want to modify the collection itself. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. |
DELETE | Delete | 405 (Method Not Allowed), unless you want to delete the whole collection—not often desirable. | 200 (OK). 404 (Not Found), if ID not found or invalid. |
http://www.restapitutorial.com/lessons/httpmethods.html
6. HTTP 標準協議
檢查請求的內容是否符合 HTTP 標準協議, 這是一種比較有效且直覺的方式
任意修改 HTTP 協議內容可能會導致的攻擊如下:
Nature | Type | ID | Name | |
---|---|---|---|---|
ChildOf | 272 | Protocol Manipulation |
1000
|
|
ParentOf | 5 | Blue Boxing |
1000
|
|
ParentOf | 33 | HTTP Request Smuggling |
1000
|
|
ParentOf | 34 | HTTP Response Splitting |
1000
|
|
ParentOf | 90 | Reflection Attack in Authentication Protocol |
1000
|
|
ParentOf | 105 | HTTP Request Splitting |
1000
|
|
ParentOf | 273 | HTTP Response Smuggling |
1000
|
|
ParentOf | 274 | HTTP Verb Tampering |
1000
|
http://capec.mitre.org/data/definitions/220.html
HTTP 協議中檢查的重點為:
- MIME中filename 檔名
- URL 合法性
- Content-Length數值
- 衝突與重複的 HTTP headers, 例如 keep-alive 與close重複與衝突
- 不安全的字元, 例如 ” “, “<“, “>”, “{“, “}”, “|”, “\”, “^”, “~”, “[“, “]”, and “`”.等
- 過濾異常缺少 Http header 的請求, 一般正常的請求會包含 Host, User-Agent, Accept headers, 因此如果缺少或是沒有值都是表示異常
- Content-Length不等於 0 但是卻沒有Content-Type
- HTTP protocol version
https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
http://www.ietf.org/rfc/rfc2183.txt
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
http://www.ietf.org/rfc/rfc1738.txt
7. 合法字元範圍白名單
適用HTTP範圍 | 建議ASCII字符範圍 |
REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES | ASCII 1-255
ASCII全部範圍, 除了 NULL |
REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES | ASCII 9,10,13,32-126,128-255
ASCII可視字元範圍 + TAB + 換行 |
REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES and REQUEST_BODY | ASCII 32-36,38-126
可視範圍, 除了 % |
ARGS, ARGS_NAMES and REQUEST_BODY | ASCII 38,44-46,48-58,61,65-90,95,97-122
僅包含 A-Z a-z 0-9 = – _ . , : & |
除了 User-Agent, Referer and Cookie的 REQUEST_HEADERS | ASCII 32,34,38,42-59,61,65-90,95,97-122
A-Z a-z 0-9 = – _ . , : & ” * + / SPACE |
參考 ModSecurity Rules
8. HTTP request Smuggling 攻擊
HTTP request smuggling 攻擊主要利用重複傳送 content-length 造成 Web proxy 與 Web server 讀取資料的異常
常見的特徵會在 HTTP 請求內容內出現重複不一致的 Content-Length與Transfer-Encoding
詳細參考:
http://projects.webappsec.org/HTTP-Request-Smuggling
9. Header Injection 攻擊
這種攻擊方式主要在 Http header 中加入換行符號 %0d %0a
https://en.wikipedia.org/wiki/HTTP_header_injection
目錄字典攻擊
這種攻擊方式黑客嘗試訪問非正常或是未經授權的訪問路徑
常見的特徵有 /../ ..\ ../ Index of To Parent Directory等
因此當訪問路徑包含有 /../ ..\ ../ 也是異常的一種訪問
10. 異常的系統檔案讀取
有些常見的系統檔案或是設定檔不對外開放, 如果在來源請求中有這些檔案名稱也是異常存取,
- Linux: /etc/passwd/ /etc/hosts
- Windows: /WINDOWS/system32/drivers/etc/hosts /boot.ini
- PhpAdmin: /etc/phpmyadmin/config.inc.php
- MySQL: /var/log/mysql.err
可參考這列表
https://github.com/lightos/Panoptic/blob/master/cases.xml
11. OWASP top 10 攻擊
其他攻擊的檢測還包含 OWASP top 10
- A1 Injection
- A2 Broken Authentication and Session Management
- A3 Cross-Site Scripting (XSS)
- A4 Broken Access Control (As it was in 2004)
- A5 Security Misconfiguration
- A6 Sensitive Data Exposure
- A7 Insufficient Attack Protection (NEW)
- A8 Cross-Site Request Forgery (CSRF)
- A9 Using Components with Known Vulnerabilities
- A10 Underprotected APIs (NEW)
12. 異常已知的 User Agent
常見的自動化攻擊工具或是網站攻擊工具會有預設的 UserAgent ,
這也是一種可以過濾基本已知網站攻擊工具的一種方式
例如:
“ArchiveTeam”, // ignores robots.txt and hammers server
“adwords”, // referrer spam
“autoemailspider”, // spam harvester
“blogsearchbot-martin”, // from honeypot
“BrowserEmulator/”, // open proxy software
參考