nginx利用lua語(yǔ)言實(shí)現(xiàn)軟waf的示例代碼
首先下載nginx的安裝包:
wget http://nginx.org/download/nginx-1.14.0.tar.gz
這里下載的是nginx1.14的包,感覺(jué)安裝包太老的話可以去官網(wǎng)下載新的版本:
官網(wǎng)地址:http://nginx.org/
但是我這里測(cè)試使用的不是nginx的安裝包,而是使用的淘寶開(kāi)發(fā)師提供的OpenResty;
其官方網(wǎng)站OpenResty® - Open source我們讀起來(lái)是非常的方便。OpenResty是一個(gè)基于Nginx與 Lua 的高性能 Web 平臺(tái),其內(nèi)部集成了大量精良的 Lua 庫(kù)、第三方模塊以及大多數(shù)的依賴項(xiàng)。
用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)。所以本身OpenResty內(nèi)部就已經(jīng)集成了Nginx和Lua,所以我們使用起來(lái)會(huì)更加方便。
下載OpenResty:
wget https://openresty.org/download/openresty-1.19.3.2.tar.gz
解壓縮:
tar -zxvf openresty-1.19.3.2.tar.gz && cd openresty-1.19.3.2
編譯安裝:
./configure && make && make install
進(jìn)入OpenResty的目錄,找到nginx:
cd /usr/local/openresty/nginx/
在conf目錄下的nginx.conf添加如下內(nèi)容:
location /lua{ default_type 'text/html'; content_by_lua 'ngx.say("<h1>HELLO,world</h1>")'; }
通過(guò)瀏覽器訪問(wèn)測(cè)試:
測(cè)試nginx沒(méi)問(wèn)題后,就開(kāi)始本次實(shí)驗(yàn):
利用XSS檢測(cè)lua腳本
這里我寫(xiě)了一個(gè)簡(jiǎn)單XSS檢測(cè),直接上代碼
local function has_xss(payload) if payload and type(payload) == "string" then if string.find(payload, "<script>") or string.find(payload, "javascript:") or string.find(payload, "onerror=") then return true end end return false end ngx.req.read_body() local args = ngx.req.get_uri_args() for key, val in pairs(args) do if has_xss(val) then ngx.exit(ngx.HTTP_FORBIDDEN) end end
可以看到,我寫(xiě)了一個(gè)xss的檢測(cè)函數(shù)has_xss,當(dāng)然規(guī)則比較簡(jiǎn)單。同時(shí)接下來(lái),用了ngx.req.read_body()函數(shù),當(dāng)你需要處理HTTP請(qǐng)求時(shí),必須優(yōu)先調(diào)用該函數(shù),隨后才可以獲取HTTP的請(qǐng)求數(shù)據(jù)。
這里調(diào)用過(guò)該函數(shù)后,我取到了uri的參數(shù)數(shù)據(jù)。當(dāng)然也可以通過(guò)ngx.req.get_post_args()或者ngx.req.get_body_data()來(lái)分別獲取post參數(shù)和請(qǐng)求數(shù)據(jù)。除此之外,更多的用法函數(shù)可以參考最上方的文檔進(jìn)行查詢。
最后就是循環(huán)遍歷參數(shù)并執(zhí)行has_xss進(jìn)行判斷,如果發(fā)現(xiàn)命中匹配字符,則返回FORBIDDEN也就是403狀態(tài)碼。
掛載Lua
這里我的lua腳本路徑為:/home/gsl/xss_check.lua
打開(kāi)nginx的配置文件:
/usr/local/openresty/nginx/conf/nginx.conf
在配置文件中添加location:
error_page 403 /attack_403; location = /attack_403 { try_files $uri $uri/ /attack_403.html; internal; } location / { access_by_lua_file /home/ssremex/nginx_lua/xss_check.lua; try_files $uri $uri/ /index.html; } location /lua { default_type "text/html"; content_by_lua 'ngx.say("<h1>hello world</h1>")'; }
這里將默認(rèn)的發(fā)布文件目錄修改為/home/gsl,因?yàn)樵谶@里我還有兩個(gè)html文件;
接下來(lái)那就是要編寫(xiě)html文件了:
第一個(gè)是發(fā)現(xiàn)uri不正確/檢測(cè)到有問(wèn)題的,需要提醒被攻擊,這個(gè)html文件的路徑為:
/home/gsl/attack_403.html
html代碼如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WARNNING</title> </head> <body> <h1>發(fā)現(xiàn)攻擊,已禁止</h1> </body> </html>
另外一個(gè)就是如果檢測(cè)到正確就訪問(wèn)index文件:
路徑為:/home/gsl/index.html
html代碼如下(我這里為了測(cè)試找了一個(gè)簡(jiǎn)單的代替):
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的網(wǎng)頁(yè)</title> </head> <body> <h1>這是標(biāo)題</h1> <p>這是段落。</p> <!-- 在此處添加其他內(nèi)容 --> </body> </html>
nginx.conf的配置文件也像上邊一樣配置完成,那么這時(shí)就可以使用Nginx命令來(lái)檢測(cè)一下nginx的語(yǔ)法是否正確,并且重新加載一下配置文件:
我這里是編譯安裝的nginx,并且也沒(méi)有將nginx的可執(zhí)行文件配置在/usr/sbin(已經(jīng)配置的環(huán)境變量)目錄下,所以我需要進(jìn)入:/usr/local/openresty/nginx/sbin下執(zhí)行命令
./nginx -t
nginx -s reload
然后正常訪問(wèn)一下:
添加xss參數(shù)模擬一下錯(cuò)誤:
http://ip:port/?a=%3Cscript%3E
已經(jīng)被檢測(cè)到;
OK,本次實(shí)驗(yàn)結(jié)束;
以上就是nginx利用lua語(yǔ)言實(shí)現(xiàn)軟waf的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于nginx lua實(shí)現(xiàn)軟waf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx跨域訪問(wèn)配置方式(Web反向代理跨域訪問(wèn)配置)
這篇文章主要介紹了Nginx跨域訪問(wèn)配置方式(Web反向代理跨域訪問(wèn)配置),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Nginx Rewrite使用場(chǎng)景及配置方法解析
這篇文章主要介紹了Nginx Rewrite使用場(chǎng)景及配置方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09nginx反向代理60s超時(shí)報(bào)錯(cuò)問(wèn)題解決
本文主要介紹了Nginx反向代理時(shí)遇到60秒超時(shí)報(bào)錯(cuò)的問(wèn)題,經(jīng)過(guò)排查發(fā)現(xiàn)是由于代理服務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng)導(dǎo)致的,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02shell腳本實(shí)戰(zhàn)之部署nginx腳本實(shí)例
最近自己編寫(xiě)的Linux一鍵部署腳本,可以一鍵部署Nginx,分享給大家,這篇文章主要給大家介紹了關(guān)于shell腳本實(shí)戰(zhàn)之部署nginx腳本的相關(guān)資料,需要的朋友可以參考下2022-12-12Nginx部署https網(wǎng)站并配置地址重寫(xiě)的步驟詳解
今天小編就為大家分享一篇關(guān)于Nginx部署https網(wǎng)站并配置地址重寫(xiě)的步驟詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Nginx代理導(dǎo)致請(qǐng)求頭某些內(nèi)容丟失的問(wèn)題解決
本文主要介紹了在使用NGINX代理時(shí)請(qǐng)求頭中的下劃線被自動(dòng)忽略的問(wèn)題,通過(guò)兩種方法解決了這個(gè)問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02nginx全局塊的user指令的實(shí)現(xiàn)示例
user用于配置運(yùn)行Nginx服務(wù)器的worker進(jìn)程的用戶和用戶組,本文主要介紹了nginx全局塊的user指令的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07ubuntu中如何使用nginx監(jiān)聽(tīng)80端口進(jìn)行轉(zhuǎn)發(fā)
這篇文章主要介紹了ubuntu中如何使用nginx監(jiān)聽(tīng)80端口進(jìn)行轉(zhuǎn)發(fā)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06