nginx利用lua語言實(shí)現(xiàn)軟waf的示例代碼
首先下載nginx的安裝包:
wget http://nginx.org/download/nginx-1.14.0.tar.gz
這里下載的是nginx1.14的包,感覺安裝包太老的話可以去官網(wǎng)下載新的版本:
官網(wǎng)地址:http://nginx.org/
但是我這里測試使用的不是nginx的安裝包,而是使用的淘寶開發(fā)師提供的OpenResty;
其官方網(wǎng)站OpenResty® - Open source我們讀起來是非常的方便。OpenResty是一個(gè)基于Nginx與 Lua 的高性能 Web 平臺(tái),其內(nèi)部集成了大量精良的 Lua 庫、第三方模塊以及大多數(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,所以我們使用起來會(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>")'; }
通過瀏覽器訪問測試:
測試nginx沒問題后,就開始本次實(shí)驗(yàn):
利用XSS檢測lua腳本
這里我寫了一個(gè)簡單XSS檢測,直接上代碼
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
可以看到,我寫了一個(gè)xss的檢測函數(shù)has_xss,當(dāng)然規(guī)則比較簡單。同時(shí)接下來,用了ngx.req.read_body()函數(shù),當(dāng)你需要處理HTTP請(qǐng)求時(shí),必須優(yōu)先調(diào)用該函數(shù),隨后才可以獲取HTTP的請(qǐng)求數(shù)據(jù)。
這里調(diào)用過該函數(shù)后,我取到了uri的參數(shù)數(shù)據(jù)。當(dāng)然也可以通過ngx.req.get_post_args()或者ngx.req.get_body_data()來分別獲取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
打開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文件;
接下來那就是要編寫html文件了:
第一個(gè)是發(fā)現(xiàn)uri不正確/檢測到有問題的,需要提醒被攻擊,這個(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è)就是如果檢測到正確就訪問index文件:
路徑為:/home/gsl/index.html
html代碼如下(我這里為了測試找了一個(gè)簡單的代替):
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的網(wǎng)頁</title> </head> <body> <h1>這是標(biāo)題</h1> <p>這是段落。</p> <!-- 在此處添加其他內(nèi)容 --> </body> </html>
nginx.conf的配置文件也像上邊一樣配置完成,那么這時(shí)就可以使用Nginx命令來檢測一下nginx的語法是否正確,并且重新加載一下配置文件:
我這里是編譯安裝的nginx,并且也沒有將nginx的可執(zhí)行文件配置在/usr/sbin(已經(jīng)配置的環(huán)境變量)目錄下,所以我需要進(jìn)入:/usr/local/openresty/nginx/sbin下執(zhí)行命令
./nginx -t
nginx -s reload
然后正常訪問一下:
添加xss參數(shù)模擬一下錯(cuò)誤:
http://ip:port/?a=%3Cscript%3E
已經(jīng)被檢測到;
OK,本次實(shí)驗(yàn)結(jié)束;
以上就是nginx利用lua語言實(shí)現(xiàn)軟waf的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于nginx lua實(shí)現(xiàn)軟waf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx反向代理60s超時(shí)報(bào)錯(cuò)問題解決
本文主要介紹了Nginx反向代理時(shí)遇到60秒超時(shí)報(bào)錯(cuò)的問題,經(jīng)過排查發(fā)現(xiàn)是由于代理服務(wù)執(zhí)行時(shí)間過長導(dǎo)致的,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02shell腳本實(shí)戰(zhàn)之部署nginx腳本實(shí)例
最近自己編寫的Linux一鍵部署腳本,可以一鍵部署Nginx,分享給大家,這篇文章主要給大家介紹了關(guān)于shell腳本實(shí)戰(zhàn)之部署nginx腳本的相關(guān)資料,需要的朋友可以參考下2022-12-12Nginx部署https網(wǎng)站并配置地址重寫的步驟詳解
今天小編就為大家分享一篇關(guān)于Nginx部署https網(wǎng)站并配置地址重寫的步驟詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Nginx代理導(dǎo)致請(qǐng)求頭某些內(nèi)容丟失的問題解決
本文主要介紹了在使用NGINX代理時(shí)請(qǐng)求頭中的下劃線被自動(dòng)忽略的問題,通過兩種方法解決了這個(gè)問題,具有一定的參考價(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)聽80端口進(jìn)行轉(zhuǎn)發(fā)
這篇文章主要介紹了ubuntu中如何使用nginx監(jiān)聽80端口進(jìn)行轉(zhuǎn)發(fā)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06