基于Nginx+lua實(shí)現(xiàn)簡單的XSS攻擊攔截
Lua
關(guān)于Lua,它是一個(gè)腳本語言,因?yàn)樗鼧O其輕量級(jí),所以一般廣泛應(yīng)用于游戲腳本等高性能的領(lǐng)域。Nginx也有專門對(duì)Lua腳本支持的模塊,后續(xù)的軟WAF實(shí)現(xiàn)主要就是依賴于Nginx掛載Lua腳本,關(guān)于Lua的語法比較簡單,可以參考上述文檔,不過多贅述。
Nginx的Lua支持
Nginx本身就是模塊化的,可以針對(duì)模塊進(jìn)行增加修改。那么對(duì)于lua的能力支持,主要就是 ngx_http_lua_module 模塊來提供的。
location /lua { default_type "text/html"; content_by_lua 'ngx.say("<h1>hello world</h1>")'; }
如果發(fā)現(xiàn)不能成功執(zhí)行,這里便用如下命令,手動(dòng)安裝一下擴(kuò)展再試試
sudo apt update sudo apt install nginx-extras
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()獲取post參數(shù),也可以通過ngx.req.get_body_data()來獲取請(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/ssremex/nginx_lua/xss_check.lua
打開nginx的配置文件 /etc/nginx/nginx.conf
http{ ... server { ... location / { access_by_lua_file /home/ssremex/nginx_lua/xss_check.lua; try_files $uri $uri/ /index.html; } ... } ... }
通過access_by_lua_file來使lua腳本掛載到根路由下。
同時(shí),因?yàn)樵蹅兌x了攔截返回狀態(tài)碼403,所以希望攔截的時(shí)候能夠返回這個(gè)頁面,先簡單寫個(gè)403頁面 attack_403.html,
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WARNNING</title> </head> <body> <h1>發(fā)現(xiàn)攻擊,已禁止</h1> </body> </html>
在nginx.conf中配置上error_page,因?yàn)橹拔乙呀?jīng)設(shè)定了web的全局跟路徑root,所以我直接將attack_403.html文件放到根路徑下也就是home_demo下,路徑為/home/ssremex/home_demo/attack_403.html
nginx相關(guān)配置如下
http { ... server { listen 8088; # 更換成自己像監(jiān)聽的端口 server_name 0.0.0.0; root /home/ssremex/home_demo; 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>")'; } } ... }
查看效果
本次我們實(shí)現(xiàn)的是GET請(qǐng)求的xss檢測
nginx -t
通過該命令,測試配置文件沒啥問題。
隨后,重啟nginx服務(wù)
systemctl restart nginx
訪問WEB服務(wù)
一切正常,添加xss參數(shù):http://ip:port/?a=%3Cscript%3E
可以看到直接跳轉(zhuǎn)到403界面,完美實(shí)現(xiàn)一個(gè)簡單的攔截。
到此這篇關(guān)于基于Nginx+lua實(shí)現(xiàn)XSS攻擊攔截的文章就介紹到這了,更多相關(guān)Nginx+lua實(shí)現(xiàn)XSS攻擊攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決Nginx 504 Gateway time-out問題
這篇文章主要介紹了完美解決Nginx 504 Gateway time-out問題,需要的朋友可以參考下2014-11-11nginx+tomcat實(shí)現(xiàn)Windows系統(tǒng)下的負(fù)載均衡搭建教程
下面小編就為大家分享一篇nginx+tomcat實(shí)現(xiàn)Windows系統(tǒng)下的負(fù)載均衡搭建教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12Nginx配置origin限制跨域請(qǐng)求的詳細(xì)過程
這篇文章主要介紹了Nginx配置origin限制跨域請(qǐng)求的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06windows下nginx的安裝使用及解決80端口被占用nginx不能啟動(dòng)的問題
這篇文章主要給大家介紹了關(guān)于windows下nginx的安裝使用,以及如何解決80端口被占用導(dǎo)致nginx不能啟動(dòng)的問題,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04為高負(fù)載網(wǎng)絡(luò)優(yōu)化Nginx和Node.js的方法
如果不先對(duì)Nginx和Node.js的底層傳輸機(jī)制有所了解,并進(jìn)行針對(duì)性優(yōu)化,可能對(duì)兩者再細(xì)致的調(diào)優(yōu)也會(huì)徒勞無功。一般情況下,Nginx通過TCP socket來連接客戶端與上游應(yīng)用2013-02-02Nginx常用命令和部署詳解以及實(shí)戰(zhàn)案例示范
這篇文章主要介紹了Nginx的常用命令和在不同環(huán)境下的部署方法,包括在CentOS和Docker中部署Nginx,并詳細(xì)說明了如何配置Nginx以實(shí)現(xiàn)實(shí)時(shí)刷新數(shù)據(jù)和數(shù)據(jù)分析系統(tǒng)的場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02Nginx如何配置Http、Https、WS、WSS的方法步驟
這篇文章主要介紹了Nginx如何配置Http、Https、WS、WSS的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Nginx中return和rewrite的寫法及區(qū)別淺析
在Nginx中,return和rewrite都用于重定向,但有所區(qū)別,return立即終止請(qǐng)求并返回指定HTTP狀態(tài)碼,不額外請(qǐng)求,rewrite則重寫URI并引發(fā)新請(qǐng)求,需要的朋友可以參考下2024-09-09