Web應用安全防護-WAF

chaney1992發表於2021-08-29

web應用開發中不可避免需要考慮web應用的安全問題,那麼常見的安全風險包含哪些呢?

Web應用常見的安全風險

 在web應用開發中可能存在以下的安全風險:

安全風險Top 10
A1:2017-注入 將不受信任的資料作為命令或查詢的一部分傳送到解析器時,會產生諸如SQL隱碼攻擊、NoSQL隱碼攻擊、OS注入和LDAP注入的注入缺陷。攻擊者的惡意資料可以誘使解析器在沒有適當授權的情況下執行非預期命令或訪問資料。
A2:2017-失效的身份認證 通常,通過錯誤使用應用程式的身份認證和會話管理功能,攻擊者能夠破譯密碼、金鑰或會話令牌,或者利用其它開發缺陷來暫時性或永久性冒充其他使用者的身份。
A3:2017-敏感資料洩露 許多Web應用程式和API都無法正確保護敏感資料,例如:財務資料、醫療資料和PII資料。攻擊者可以通過竊取或修改未加密的資料來實施信用卡詐騙、身份盜竊或其他犯罪行為。未加密的敏感資料容易受到破壞,因此,我們需要對敏感資料加密,這些資料包括:傳輸過程中的資料、儲存的資料以及瀏覽器的互動資料。
A4:2017-XML 外部實體(XXE) 許多較早的或配置錯誤的XML處理器評估了XML檔案中的外部實體引用。攻擊者可以利用外部實體竊取使用URI檔案處理器的內部檔案和共享檔案、監聽內部掃描埠、執行遠端程式碼和實施拒絕服務攻擊。
A5:2017-失效的訪問控制 未對通過身份驗證的使用者實施恰當的訪問控制。攻擊者可以利用這些缺陷訪問未經授權的功能或資料,例如:訪問其他使用者的帳戶、檢視敏感檔案、修改其他使用者的資料、更改訪問許可權等。
A6:2017-安全配置錯誤 安全配置錯誤是最常見的安全問題,這通常是由於不安全的預設配置、不完整的臨時配置、開源雲端儲存、錯誤的 HTTP 標頭配置以及包含敏感資訊的詳細錯誤資訊所造成的。因此,我們不僅需要對所有的作業系統、框架、庫和應用程式進行安全配置,而且必須及時修補和升級它們。
A7:2017-跨站指令碼(XSS) 當應用程式的新網頁中包含不受信任的、未經恰當驗證或轉義的資料時,或者使用可以建立 HTML或JavaScript 的瀏覽器 API 更新現有的網頁時,就會出現 XSS 缺陷。XSS 讓攻擊者能夠在受害者的瀏覽器中執行指令碼,並劫持使用者會話、破壞網站或將使用者重定向到惡意站點。

A8:2017-不安全的反序列化

不安全的反序列化會導致遠端程式碼執行。即使反序列化缺陷不會導致遠端程式碼執行,攻擊者也可以利用它們來執行攻擊,包括:重播攻擊、注入攻擊和特權升級攻擊。
A9:2017-使用含有已知漏洞的元件 元件(例如:庫、框架和其他軟體模組)擁有和應用程式相同的許可權。如果應用程式中含有已知漏洞的元件被攻擊者利用,可能會造成嚴重的資料丟失或伺服器接管。同時,使用含有已知漏洞的元件的應用程式和API可能會破壞應用程式防禦、造成各種攻擊併產生嚴重影響。
A10:2017-不足的日誌記錄和監控 不足的日誌記錄和監控,以及事件響應缺失或無效的整合,使攻擊者能夠進一步攻擊系統、保持持續性或轉向更多系統,以及篡改、提取或銷燬資料。大多數缺陷研究顯示,缺陷被檢測出的時間超過200天,且通常通過外部檢測方檢測,而不是通過內部流程或監控檢測。

 那麼,這些風險有什麼辦法進行避免呢?——WAF

1、WAF

  Web 應用防火牆 (WAF-Web Application Firewall) 旨在保護 Web 應用免受各類應用層攻擊,例如跨站點指令碼 (XSS)、SQL 注入,以及 cookie 中毒等。應用是您重要資料的閘道器,因此針對應用發起的攻擊就成為了造成漏洞的主要原因。

  有了 WAF 就可以攔截一系列企圖通過入侵系統來洩漏資料的攻擊。 

 工作原理:

  WAF 通過過濾、監控和攔截惡意 HTTP 或 HTTPS 流量對 Web 應用的訪問來保護您的 Web 應用,並能夠阻止未經授權的資料離開應用。因此,WAF 需要遵守一套策略,幫助其確定哪些流量是惡意的,哪些流量是安全的。

  WAF 的操作方式與代理伺服器類似,雖然同為“中介”,但後者旨在保護客戶端身份,前者卻被稱為反向代理,因為其使命在於保護 Web 應用伺服器免受潛在惡意客戶端的影響。

  WAF 不拘泥於形式,是軟體、裝置,亦是即服務。策略可定製,以滿足您對 Web 應用或 Web 應用組合的獨特需求。雖然許多 WAF 要求您定期更新策略以解決新的漏洞,但機器學習的進步使一些 WAF 能夠自動更新。隨著威脅環境愈發複雜和不確定,這種自動化變得越來越重要。

  

 IPS與WAF區別:

  IPS :入侵防禦系統,一款目標範圍更加廣泛的安全產品。IPS 通常以簽名和政策為基礎。換言之,它可以根據簽名資料庫和既定政策,檢查眾所周知的漏洞和攻擊載體。IPS 根據資料庫和策略建立一個標準,然後會在流量偏離標準時發出警報。隨著時間的推移,新漏洞層出不窮,簽名和策略也會積少成多。一般來說,IPS 保護物件是一系列協議型別的流量,例如 DNS、SMTP、TELNET、RDP、SSH 和 FTP。通常情況下,IPS 會執行於第 3 層和第 4 層並對其提供保護,相較於網路層和會話層,對應用層(第 7 層)提供的保護力度著實有限。

  Web 應用防火牆 (WAF): WAF設計專為保護應用層而生,旨在分析應用層上各 HTTP 或 HTTPS 請求。它通常會感知使用者、會話和應用,瞭解其背後的 Web 應用及其提供的服務。正因如此,WAF 可以看作是使用者和應用之間的中介,並會提前對往來於兩者之前的通訊進行分析。傳統的 WAF 確保僅執行允許的操作(基於安全策略)。對於許多組織來說,WAF 是應用值得信賴的第一道防線,尤其是在抵禦 前面描述的10大安全風險。

 WAF部署方式:

  • 基於雲服務商提供的WAF:如AWS WAF、Amazon WAF
  • 基於軟體實現:如:Nginx方式

2、基於Nginx實現的WAF

 ngx_lua_waf是一個基於ngx_lua的web應用防火牆。可以實現WAF的相關防護功能。

 安裝步驟:

  • 安裝依賴包:
    yum -y install gcc gcc-c++ autoconf automake make unzip
    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
  • 安裝LuaJIT2.0

    下載luajit 2.0並安裝
    cd /usr/local/src/
    wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
    tar xf LuaJIT-2.0.5.tar.gz
    cd LuaJIT-2.0.5
    make && make install
  • 安裝ngx_devel_kit(NDK(nginx development kit)模組是一個擴充nginx伺服器核心功能的模組,第三方模組開發可以基於它來快速實現。)
    cd /user/local/src/
    wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
    tar xf v0.3.0.tar.gz
  • 安裝nginx_lua_module
    wget https://github.com/openresty/lua-nginx-module/archive/v0.10.20.tar.gz
    tar xf v0.10.20.tar.gz
  • 匯入環境變數
    echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile
    echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
    source /etc/profile
  • 編譯安裝Nginx
    cd /usr/local/src/
    wget http://nginx.org/download/nginx-1.21.0.tar.gz
    tar xf nginx-1.21.0.tar.gz  
    cd nginx-1.21.0
    useradd -s /sbin/nologin -M www
    cd nginx-1.21.0
     ./configure --user=www --group=www \
    --prefix=/usr/local/nginx-1.21.0 \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_gzip_static_module \
    --pid-path=/usr/local/nginx-1.21.0/nginx.pid \
    --with-http_realip_module \
    --add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
    --add-module=/usr/local/src/lua-nginx-module-0.10.20 \
    --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
    make -j2
    make install
    ln -s /usr/local/nginx-1.14.0 /usr/local/nginx
  • 新建/usr/local/nginx/logs/hack/攻擊日誌目錄,並賦予nginx使用者對該目錄的寫入許可權。
    mkdir -p /usr/local/nginx/logs/hack/
    chown -R www.www /usr/local/nginx/logs/hack/
    chmod -R 755 /usr/local/nginx/logs/hack/

   一鍵部署命令:  

#!/bin/bash
#Author: Template
yum -y install gcc gcc-c++ autoconf automake make unzip wget
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
cd /usr/local/src/

[ ! -f "LuaJIT-2.0.5.tar.gz" ] && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 
[ ! -f "nginx-1.14.0.tar.gz" ] && wget http://nginx.org/download/nginx-1.21.0.tar.gz && 
[ ! -f "v0.3.0.tar.gz" ] && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz 
[ ! -f "v0.10.13.tar.gz" ] && wget https://github.com/openresty/lua-nginx-module/archive/v0.10.20.tar.gz
[ ! -f "master.zip" ] && wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip --no-check-certificate

ls *.tar.gz | xargs -n 1  tar xf

cd LuaJIT-2.0.5 && make && make install && cd ..

echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile && \
echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
source /etc/profile
cd nginx-1.21.0 && useradd -s /sbin/nologin -M www
./configure --user=www --group=www \
--prefix=/usr/local/nginx-1.21.0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--pid-path=/usr/local/nginx-1.21.0/nginx.pid \
--with-http_realip_module \
--add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
--add-module=/usr/local/src/lua-nginx-module-0.10.20 \
--with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" && make -j8 && make install && ln -s /usr/local/nginx-1.21.0 /usr/local/nginx

mkdir -p /usr/local/nginx/logs/hack/ && chown -R www.www /usr/local/nginx/logs/hack/ && chmod -R 755 /usr/local/nginx/logs/hack/

sed -i '25 a lua_package_path \"/usr/local/nginx/conf/waf/?.lua\";\nlua_shared_dict limit 10m;\ninit_by_lua_file  /usr/local/nginx/conf/waf/init.lua;\naccess_by_lua_file /usr/local/nginx/conf/waf/waf.lua;' /usr/local/nginx/conf/nginx.conf

cd /usr/local/src/ && unzip master.zip -d /usr/local/nginx/conf/ && mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf

/usr/local/nginx/sbin/nginx

 使用方式:

  nginx安裝路徑假設為:/usr/local/nginx/conf/

  把ngx_lua_waf下載到conf目錄下,解壓命名為waf

wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
unzip master.zip -d /usr/local/nginx/conf/
mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf

  在nginx.conf的http段新增

lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

  配置config.lua裡的waf規則目錄(一般在waf/conf/目錄下)

RulePath = "/usr/local/nginx/conf/waf/wafconf/" #絕對路徑如有變動,需對應修改

  然後重啟nginx即可.  

RulePath = "/usr/local/nginx/conf/waf/wafconf/"
    --規則存放目錄
    attacklog = "off"
    --是否開啟攻擊資訊記錄,需要配置logdir
    logdir = "/usr/local/nginx/logs/hack/"
    --log儲存目錄,該目錄需要使用者自己新建,切需要nginx使用者的可寫許可權
    UrlDeny="on"
    --是否攔截url訪問
    Redirect="on"
    --是否攔截後重定向
    CookieMatch = "on"
    --是否攔截cookie攻擊
    postMatch = "on" 
    --是否攔截post攻擊
    whiteModule = "on" 
    --是否開啟URL白名單
    black_fileExt={"php","jsp"}
    --填寫不允許上傳檔案字尾型別
    ipWhitelist={"127.0.0.1"}
    --ip白名單,多個ip用逗號分隔
    ipBlocklist={"1.0.0.1"}
    --ip黑名單,多個ip用逗號分隔
    CCDeny="on"
    --是否開啟攔截cc攻擊(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
    CCrate = "100/60"
    --設定cc攻擊頻率,單位為秒.
    --預設1分鐘同一個IP只能請求同一個地址100次
    html=[[Please go away~~]]
    --警告內容,可在中括號內自定義
    備註:不要亂動雙引號,區分大小寫

參考:

 OWASP Top10

 https://github.com/EnableSecurity/wafw00f 

 https://www.bilibili.com/video/BV1tt4y167CG/

 https://github.com/loveshell/ngx_lua_waf

相關文章