打造一款可靠的WAF(Web應用防火牆)

天府雲創發表於2017-12-26

之前寫了一篇《WAF防禦能力評測及工具》,是站在安全運維人員選型WAF產品的角度來考慮的(優先從測試角度考慮是前職業病,畢竟當過3年遊戲測試?!)。本篇文章從WAF產品研發的角度來YY如何實現一款可靠的WAF,靈感來自ModSecurity等,感謝開源。

本片文章包括三個主題

(1) WAF實現 WAF包括哪些元件,這些元件如何互動來實現WAF防禦功能 

(2)WAF規則(策略)維護規則(策略)如何維護,包括獲取渠道,規則測試方法以及上線效果評測 

(3) WAF支撐WAF產品的完善需要哪些資訊庫的支撐

一、WAF實現

‍‍WAF一句話描述,就是解析HTTP請求(協議解析模組),規則檢測(規則模組),做不同的防禦動作(動作模組),並將防禦過程(日誌模組)記錄下來。不管硬體款,軟體款,雲款,核心都是這個,而接下來圍繞這句話來YY WAF的實現。WAF的實現由五個模組(配置模組、協議解析模組、規則模組、動作模組、錯誤處理模組)組成

1. 配置模組

設定WAF的檢測粒度,按需開啟,如圖所示

設定WAF的檢測粒度

2. 協議解析模組(重點)

協議解析的輸出就是下一個模組規則檢測時的操作物件,解析的粒度直接影響WAF防禦效果。對於將‍WAF模組寄生於web 伺服器的雲WAF模式,一般依賴於web 伺服器的解析能力。

協議解析模組

3. 規則模組(重點)

重點來了,這塊是WAF的核心,我將這塊又細分為三個子模組。

(1) 規則配置模組

IP黑白名單配置、 URL黑白名單配置、以及挑選合適的規則套餐。

規則配置模組

(2)規則解析模組

主要作用是解析具體的規則檔案,規則最好採用統一的規則描述語言,便於提供給第三方定製規則,ModSecurity這方面做得非常優秀。

規則檔案由四部分組成,分為變數部分、操作符部分,事務函式部分與動作部分。

規則解析模組

規則解析模組

(3)規則檢測模組

上一步我們設定了各種變數,接下來就是按照一定的邏輯來做加減乘除了。

規則檢測模組

4. 動作模組(重點)

‍通過規則檢測模組,我們識別了請求的好惡,接下來就是做出響應,量刑處理,不僅僅是攔截。‍

動作模組

5. 日誌模組(重點)

‍日誌處理,非常重要,也非常火熱,內容豐富到完全可以從WAF獨立出來形成單獨的安全產品(e.g.日誌寶)而採用提供介面的方式來支撐WAF。對於資料量巨大的雲WAF,都會有單獨的大資料團隊來支撐架構這一塊,包括資料儲存(e.g. hdfs) ,資料傳輸(kafka),資料離線分析(hadoop/spark),資料實時分析(storm),資料關聯分析(elasticsearch)等等,以後另開一篇單獨說明。‍

日誌模組

6. 錯誤處理模組

以上模組執行錯誤時的異常處理

二、WAF規則(策略)維護

‍WAF需要修煉一圖以蔽之‍

WAF規則(策略)維護

三、WAF支撐資訊庫

‍WAF需要修煉一圖以蔽之‍

WAF支撐資訊庫‍‍

以上支撐庫幾乎所有的安全人員都在重複地做,而資源沒有共享的原因,一是內部不可說;二是沒有采取統一的描述語言無法匯合,唉,安全從業人員的巴別塔。

四、補充知識(包括文章與程式碼)

想想寫了這麼多文章,自我感覺萌萌噠!

WAF相關

WAF防禦能力評測及工具

ssdeep檢測webshell

ModSecurity相關文章(我就是ModSecurity的死忠粉)

[科普文]ubuntu上安裝Apache2+ModSecurity及自定義WAF規則

ModSecurity SecRule cheatsheets

ModSecurity CRS 筆記、WAF防禦checklist,及WAF架構的一些想法

ModSecurity 晉級-如何呼叫lua指令碼進行防禦快速入門

ModSecurity 白名單設定

指紋識別

Web應用指紋識別

FingerPrint

IP相關

使用免費的本地IP地理庫來定位IP地理位置-GeoIP lookup

獲得IP的地理位置信IP Geolocation及IP位置視覺化

IP地理資訊離線獲取指令碼

IP地理資訊線上獲取指令碼

識別搜尋引擎指令碼

判斷使用哪家CDN指令碼

代理型別判斷指令碼 Proxy探測指令碼與HTTP基本認證暴力破解指令碼

CDN架構

網站負載均衡技術讀書筆記與站長產品的一點想法

正則優化

NFA引擎正則優化TIPS、Perl正則技巧及正則效能評測方法

HTTP發包工具

HTTP.pl——通過HTTP發包工具瞭解HTTP協議

HTTP發包工具 -HTTPie

WAF實現的思維導圖

參考:

ModSecurity  Handbook

‍第八、九、十,十一我是反覆看,每次都有新的靈感,第14、15章是當成新華字典看的,以免遺忘。‍

Web Application Defenders Cookbook Battling Hackers and Protecting Users》 ‍(紅寶書,還在看)

FreeBuf推薦:碳基體MM微博

http://weibo.com/tanjiti

WAF自動化暴破(繞過)指令碼xwaf

                                       _  ___      _____   ____
                                      | |/_/ | /| / / _ | / __/
                                     _.  < | |/ |/ / __ |/ _/  
                                    /_/|_| |__/|__/_/ |_/_/

xwaf

xwaf是一個python寫的waf自動繞過工具,上一個版本是bypass_waf,xwaf相比bypass_waf更智慧,可無人干預,自動暴破waf

Disclaimer

[!] legal disclaimer: Usage of 3xp10it.py and web.py for attacking targets without prior mutual consent is 
illegal.It is the end user's responsibility to obey all applicable local, state and federal laws.Developers
assume no liability and are not responsible for any misuse or damage caused by this program.

Requirement

python3
pip3
works on linux(test on ubuntu and kali2.0,others not test)

python3安裝可參考如下步驟:
    apt-get install python3
    或:
    wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
    tar xJf Python-3.5.2.tar.xz
    cd Python-3.5.2
    ./configure --prefix=/opt/python3
    make && make install
    ln -s /opt/python3/bin/python3.5 /usr/local/bin/python3

pip3安裝:
apt-get install -y python3-pip

kali linux2安裝pip3可參考如下步驟:
    echo "deb-src http://http.kali.org/kali kali main non-free contrib" >> /etc/apt/sources.list
    echo "deb-src http://security.kali.org/kali-security kali/updates main contrib non-free" >> /etc/apt/sources.list
    apt-get update
    apt-get install python3-pip

Usage

eg:
1.python3 xwaf.py -u "http://www.baidu.com/1.php?id=1"
2.python3 xwaf.py -u "http://www.baidu.com/1.php" --data="postdata" -p xxx
3.python3 xwaf.py -r /tmp/headerfile -p xxx --level 5

Attention

1.xwaf支援除-m/-l外的所有sqlmap引數,用法和sqlmap一樣即可,-m/-l為批量功能,暫不支援,如果需要批量,請自行code實現
2.由於xwaf已經有比較好的引數方案,一般情況下儘量少用引數,如果有必須要用的引數除外[如--data/-p/-r等引數]
3.普通get型別注入點,這樣用即可:
  python3 xwaf.py -u "http://www.baidu.com/1.php?id=1&page=2" -p id
4.人工輸入的引數的優先順序大於xwaf自帶的引數方案
5.關於--tamper引數的使用:
  xwaf的主要功能是排列組合使用所有可能的tamper組合來爆破waf,如果人為使用了--tamper引數,xwaf將在人為設定的已有
  tamper基礎上再排列組合,eg.人為使用的命令為:
  python3 xwaf.py -u "http://www.baidu.com/1.php?id=1" --tamper=space2comment
  那麼xwaf使用的tamper方案中的每個都會有space2comment
6.關於代理的使用:
  a)xwaf預設不用代理,如果使用代理需要在xwaf執行後選擇y|Y
  b)使用的代理來源於程式自動收集的網上的代理
  c)使用代理有防封的優點,但網路連線速度不一定能保證
7.need python3

程式碼流程圖

以[127.0.0.1/1.php?id=1為例]

1.start
2.檢測系統/root/.sqlmap/output/127.0.0.1/log檔案是否存在
3.獲取log檔案:
    如果不存在log檔案則呼叫get_log_file_need_tamper函式,執行完這個函式後獲得log檔案,也即成功檢測出目標
    url有sqli注入漏洞,如果執行完get_log_file_need_tamper函式沒有獲得log檔案則認為該url沒有sqli漏洞
4.獲取db_type[資料庫型別]
    呼叫get_db_type_need_tamper函式,用於後面的tamper排列組合時,只將目標url對應的資料庫型別的tamper用於
    該目標在sql注入時tamper的選擇後的組合
5.獲取sqli_type[注入方法]
    呼叫get_good_sqli_type_need_tamper函式,sql注入方法中一共有U|S|E+B|Q|T 6種注入方法,後3種查詢效率低,
    首先在log檔案中查詢是否有U|S|E這3種高效方法中的任意一種,如果有略過這一步,否則執行
    get_good_sqli_type_need_tamper函式,執行該函式將嘗試獲得一種以上的高效注入方法
6.獲取current-db[當前資料庫名]
    如果上面獲得了高效注入方法,則先用高效注入方法獲得current-db,如果沒有則用B|Q|T方法嘗試獲得
    current-db,用來嘗試獲得current-db的函式是get_db_name_need_tamper
7.獲取table[當前資料庫的表名]
    如果上面獲得了高效注入方法,則先用高效注入方法獲得table,如果沒有則用B|Q|T方法嘗試獲得table,嘗試獲得
    table的函式是get_table_name_need_tamper
8.獲取column[當前資料庫的第一個表的所有列名]
    如果上面獲得了高效注入方法,則先用高效注入方法獲得column,如果沒有則用B|Q|T方法獲得column,嘗試獲得
    column的函式是get_column_name_need_tamper
9.獲取entries[column對應的真實資料]
    呼叫get_entries_need_tamper函式,執行完get_entries_need_tamper函式後,waf成功繞過,從上面的步驟一直到
    這個步驟,逐步獲得最佳繞過waf的指令碼組合

About

1.xwaf支援記憶,執行中斷後下次繼續執行時會在中斷時的最後一個命令附近繼續跑,不會重新經歷上面的所有函式的處理
2.xwaf支援sqlmap除-m/-l外的所有引數用法
3.各個get_xxx_need_tamper函式的處理採用針對當前url的資料庫型別(eg.MySQL)的所有過waf的指令碼
  (在sqlmap的tamper目錄中)的排列組合的結果與--hex或--no-cast選項進行暴力破解如果--hex起作用了則不再使用
  --no-cast嘗試,--no-cast起作用了也不再用--hex嘗試
4.xwaf執行完後將在/root/.sqlmap/output/127.0.0.1目錄下的ini檔案中看到相關資訊,bypassed_command是成功暴破
  waf的sqlmap語句
5.在tamper組合中,先用到的tamper會加入到上面的ini檔案中,在以後的每個tamper組合中,綜合已經得到的有用的
  tamper再組合,在上面的ini檔案中的tamper_list即為不斷完善的tamper組合
6.支援自動更新升級,當前版本為1.1

Changelog

[2017-02-13]
更新支援代替sqlmap跑普通沒有waf的注入點,之前版本要求只能跑有waf的注入點

[2017-02-13]
更新支援自動進行版本升級

[2017-02-12] 
更新支援所有sqlmap引數

[2017-01-18]
fix line128處的slef改成self  
fix line128處的db_name未定義錯誤

[2016-11-15]
修復一處ACCESS資料庫考慮不周全判斷和幾處good_print函式呼叫錯誤
增加支援代理自動切換功能,自選,預設不用代理[用代理速度較慢]

[2016-11-02]
增加access資料庫特殊性的處理gg

[2016-11-01]
get_db_type_need_tamper之後的資料庫型別獲取由之前的get_db_type_from_log_file改成
eval(get_key_value_from_config_file(self.log_config_file,'default','db_type'))
附錄:WAF攻防實戰

摘要

本文主要分為四個部分,一、首先對WAF做了簡單的介紹,讓讀者對WAF這類產品有一個大概的瞭解;二、這部分通過一個例項演示瞭如何利用WAF為其後端的Web應用提供安全防護功能;三、安全是相對的,世界上任何一款安全產品都不可能提供100%的安全防護功能,WAF也是一樣。因此,第三部分主要討論了WAF的安全性,介紹了一些主流的WAF繞過技術,並結合真實案例來演示瞭如何嘗試繞過WAF的防護,成功攻擊其後端的Web應用;四、這部分對WAF的安全性進行了總結,告訴讀者如何用正確、理性的眼光去看待WAF這類產品。

1、WAF介紹

WAF(Web Application Firewall)的中文名稱叫做“Web應用防火牆”,利用國際上公認的一種說法,WAF的定義是這樣的:Web應用防火牆是通過執行一系列針對HTTP/HTTPS的安全策略來專門為Web應用提供保護的一款產品。通過從上面對WAF的定義中,我們可以很清晰的瞭解到,WAF是一種工作在應用層的、通過特定的安全策略來專門為Web應用提供安全防護的產品。

根據不同的分類方法,WAF可分為許多種。從產品形態上來劃分,WAF主要分為以下三大類:

1.1硬體裝置類

目前安全市場上,大多數的WAF都屬於此類。它們以一個獨立的硬體裝置的形態存在,支援以多種方式(如透明橋接模式、旁路模式、反向代理等)部署到網路中為後端的Web應用提供安全防護。相對於軟體產品類的WAF,這類產品的優點是效能好、功能全面、支援多種模式部署等,但它的價格通常比較貴。國內的綠盟、安恆、啟明星辰等廠商生產的WAF都屬於此類。

1.2軟體產品類

這種型別的WAF採用純軟體的方式實現,特點是安裝簡單,容易使用,成本低。但它的缺點也是顯而易見的,因為它必須安裝在Web應用伺服器上,除了效能受到限制外,還可能會存在相容性、安全等問題。這類WAF的代表有ModSecurity、Naxsi、網站安全狗等。

1.3基於雲的WAF

隨著雲端計算技術的快速發展,使得其於雲的WAF實現成為可能。國內創新工場旗下的安全寶、360的網站寶是這類WAF的典型代表。它的優點是快速部署、零維護、成本低。對於中、小型的企業和個人站長是很有吸引力的。

2、利用WAF為Web應用提供防護

在這裡,我們以Naxsi為例來演示下如何利用WAF來為其後端的Web應用提供安全防護。Naxsi是一個開放原始碼、高效、低維護規則的Nginx web應用防火牆模組。Naxsi的主要目標是幫助人們加固他們的web應用程式,以抵禦SQL隱碼攻擊、跨站指令碼、跨域偽造請求、本地和遠端檔案包含漏洞。詳見http://code.google.com/p/naxsi/wiki/TableOfContents?tm=6

,這裡因為篇幅關係就不再詳細的介紹了,這裡主要演示Naxsi的安裝、配置及防護效果。

2.1部署架構:

2.1.1將Nginx配置為反向代理;讓訪問後端Web伺服器的流量都經過Nginx

2.1.2讓Nasxi(WAF)檢測經過Nginx的流量,將攻擊流量根據相關配置進行阻斷,從而保護執行在後端Web伺服器上的應用程式。

使用者正常訪問請求處理流程具體如下圖所示:

圖1

攻擊者惡意請求處理流程具體如下圖:

圖2

2.2 Nginx+Naxsi安裝

安裝包:

Nginx 1.3.15:http://nginx.org/download/nginx-1.3.15.tar.gz

Naxsi 0.50:http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

pcre-8.32:http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

安裝過程:

安裝必要的支援元件

在安裝Nginx之前,需要先安裝必要的支援元件,否則Nginx無法正常安裝。

安裝pcre過程:

[root@localhost LNMP]# wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

[root@localhost LNMP]#tar -zxvf pcre-8.32.tar.gz

[root@localhost nginx-1.3.15]#cd pcre-8.32

[root@localhost pcre-8.32]]#./configure

[root@localhost pcre-8.32]#make && make install

安裝zlib庫元件過程:

[root@localhost LNMP]# yum -y install zlib-devel

Nginx和Naxsi安裝過程

[root@localhost LNMP]# wget http://nginx.org/download/nginx-1.3.15.tar.gz

[root@localhost LNMP]# wget http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

[root@localhost LNMP]# tar -zxvf nginx-1.3.15.tar.gz

[root@localhost LNMP]# tar -zxvf naxsi-core-0.50.tgz

[root@localhost LNMP]# cd nginx-1.3.15

[root@localhost nginx-1.3.15]# ./configure --add-module=../naxsi-core-0.50/naxsi_src

[root@localhost nginx-1.3.15]#make && make install

啟動Nginx,並測試

/usr/local/nginx/sbin/nginx        #啟動Nginx

/usr/local/nginx/sbin/nginx -t     #測試配置檔案是否正常

Killall -9 nginx                    #殺死nginx程式

kill -HUP `cat /usr/local/www/nginx/logs/nginx.pid`   #以平滑方式重啟Nginx

圖3

如果在啟動Nginx時,出現如下錯誤:

圖4

按照下面的方法即可解決。

32位系統 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位系統 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64

2.3配置過程:

這個具體配置分為兩個過程:一、修改Nginx.conf配置檔案,配置與Naxsi(WAF)相關選項;二、將Nginx配置為反向代理,為後端Web伺服器提供防護。

2.3.1配置Naxsi相關

首先,將Naxsi的核心配置規則庫拷貝一份至Nginx檔案所在目錄,

圖5

接著修改Nginx.conf配置檔案,在其中加入如下一行配置,讓其包含Naxsi的核心規則庫檔案:

圖6

然後定義一個虛擬主機的安全規則,可參考下面的內容:

LearningMode; #Enables learning mode

SecRulesEnabled;

#SecRulesDisabled;

DeniedUrl "/RequestDenied";

include "/tmp/naxsi_rules.tmp";

## check rules

CheckRule "$SQL >= 8" BLOCK;

CheckRule "$RFI >= 8" BLOCK;

CheckRule "$TRAVERSAL >= 4" BLOCK;

CheckRule "$EVADE >= 4" BLOCK;

CheckRule "$XSS >= 8" BLOCK;

將上面的內容儲存在一個檔案中。如test.rules。下面會用到。

自定義一個阻斷頁面,當WAF檢測到攻擊時,會將該頁面返回給使用者,可參考如下內容:

<html>

<head>

<title>Error 403 Request Denied</title>

</head>

<body>

<h2>Error 403 Request Denied</h2>

For some reasons, your request has been denied.

</body>

</html>

2.3.2配置反向代理

新建一個虛擬主機的配置檔案,具體配置如下圖所示:

圖7

最後,再次修改Nginx.conf,使其包含剛定義的虛擬主機配置檔案即可。

圖8

重啟Nginx服務後配置生效。

2.4防護效果演示

未使用WAF時,不具備攻擊防護能力。

圖9

圖10

圖11

使用WAF後,惡意攻擊被阻斷。

圖12

圖13

圖14

3、WAF安全介紹

WAF作為一種安全產品為Web應用提供安全防護,可以增大攻擊者的攻擊難度和攻擊成本,這一點是不容至疑的。但是,WAF並不是萬能的,世界上沒有任何一款安全產品可以提供100%的安全防護。由於產品的設計或實現原理,及其他問題都有可能導致攻擊者可以成功繞過WAF的防護,來達到攻擊後端Web應用的目的。除了WAF自身的安全性以外,現在討論最多的就是WAF的繞過技術。在介紹WAF繞過技術之前,我們必須要要搞明白一個問題,那就是WAF為什麼會存在被繞過的風險?這是因為WAF對資料包的解析和Web伺服器對資料包的解析兩者之間存在差異,所以存在被繞過的可能。下面列出了一些在SQL隱碼攻擊過程中主流的WAF繞過技術:

1.轉換特徵字元大小寫

2.利用註釋繞過

3.編碼特徵字元繞過

4.分隔重寫特徵字元繞過

5.利用截斷字元繞過

6.變換變數位置繞過

7.針對域名保護的繞近

8.超大資料包繞過

9.轉換資料提交方式繞過

10.HPP(HTTP引數汙染)繞過

上面列出的這些WAF繞過技術網上都有相應的詳細介紹,這裡因為篇幅關係就不再介紹了,感興趣的讀者可以自行百度查詢相關資料。下面我們通過一個真實案例來介紹下WAF的繞過。

WAF繞過技術例項

在前段時間安全寶舉辦的一個WAF繞過活動中,白帽子們通過各種技巧成功繞過了安全寶的WAF。下面以一個我發現的WAF繞過技巧來進行說明:

背景介紹:

在一個存在SQL隱碼攻擊漏洞的Web應用前面部署了安全寶的雲WAF,訪問Web應用的流量首先要經過WAF,由WAF檢測是否存在攻擊行為,如果WAF檢測到惡意攻擊行為,將向攻擊者返回特定的阻斷頁面。否則,將返回正常的頁面。

1.先通過經典的“and 1=1”去判斷該Web應用是否存在SQL隱碼攻擊漏洞。因為前端有WAF的防護,正常情況該請求應該會被WAF攔截。同預想的結果一樣,當我們傳送有攻擊特徵的請求時,會WAF阻斷,返回了一個405的錯誤頁面。

圖15

2.現在我們嘗試將GET請求轉換為POST,在POST的請求中帶上攻擊字串,來判斷是否是被WAF攔截。結果如何呢?請看下圖:

圖16

3.通過上圖我們可以看到該請求並沒有被WAF攔截,而是返回了Web應用的正常頁面。說明我們成功繞過了WAF。但是,到此為至,我們僅僅是確認了該Web應用存在SQL隱碼攻擊漏洞。那麼下面我們來嘗試構造SQL語句來提取該Web應用資料庫的相關資訊。結果如下圖:

圖17

4.通過上面的測試,我們可以確認,將GET請求轉換為POST後,可以成功繞過WAF的檢測,從而成功獲取到目標Web應用的相關資訊和資料。其他的WAF也可能會存在同樣的問題。

4、總結

通過上面的介紹和相應的例項演示,相信讀者對WAF都有了一個比較全面的認識。那麼我們應該如何看待WAF這類產品呢?有兩種極端的認識都是錯誤的,1、部署WAF後,就可以高枕無憂,不用再擔心安全問題了;2.WAF沒有用,理由是可能會被繞過。

為什麼說這兩種認識都是錯誤的呢?首先對於第一點,WAF作為一種安全產品,防護的是通用型的攻擊,通常擔任一個虛擬補丁的角色。還有各個廠家的WAF因為實現原理、技術能力、型號等其他方面的原因在效能、防護能力上也並不相同,不可一概而論。WAF可以防禦大部分的常規攻擊,阻擋很大一部分的攻擊者,這一點不可否認,否則WAF也就沒有存在的價值了。但對於一些技術能力較強的攻擊者,WAF並不能阻擋住他們攻擊的腳步,他們有能力繞過WAF來成功實施攻擊。對於第二點,其實我們前面已經說過了,安全是相對的,世界上沒有哪款安全產品可以提供100%的安全防護。所以,我對於WAF的態度是,沒有必要神化WAF,它並不像廠商說的那樣神奇,但也不用過分看淡WAF,畢竟WAF可以阻擋大部分的常規攻擊,可以極大提高Web應用的安全性,是一種Web應用防護的有效手段。


相關文章