基于Nginx+lua實現(xiàn)簡單的XSS攻擊攔截
Lua
關(guān)于Lua,它是一個腳本語言,因為它極其輕量級,所以一般廣泛應(yīng)用于游戲腳本等高性能的領(lǐng)域。Nginx也有專門對Lua腳本支持的模塊,后續(xù)的軟WAF實現(xiàn)主要就是依賴于Nginx掛載Lua腳本,關(guān)于Lua的語法比較簡單,可以參考上述文檔,不過多贅述。
Nginx的Lua支持
Nginx本身就是模塊化的,可以針對模塊進行增加修改。那么對于lua的能力支持,主要就是 ngx_http_lua_module 模塊來提供的。
location /lua { default_type "text/html"; content_by_lua 'ngx.say("<h1>hello world</h1>")'; }
如果發(fā)現(xiàn)不能成功執(zhí)行,這里便用如下命令,手動安裝一下擴展再試試
sudo apt update sudo apt install nginx-extras
XSS檢測lua腳本
這里我寫了一個簡單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
可以看到,我寫了一個xss的檢測函數(shù)has_xss,當然規(guī)則比較簡單。同時接下來,用了ngx.req.read_body()函數(shù),當你需要處理HTTP請求時,必須優(yōu)先調(diào)用該函數(shù),隨后才可以獲取HTTP的請求數(shù)據(jù)。
這里調(diào)用過該函數(shù)后,我取到了uri的參數(shù)數(shù)據(jù),當然也可以通過ngx.req.get_post_args()獲取post參數(shù),也可以通過ngx.req.get_body_data()來獲取請求數(shù)據(jù),更多的用法函數(shù)可以參考最上方的文檔進行查詢。
最后就是循環(huán)遍歷參數(shù)并執(zhí)行has_xss進行判斷,如果發(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腳本掛載到根路由下。
同時,因為咱們定義了攔截返回狀態(tài)碼403,所以希望攔截的時候能夠返回這個頁面,先簡單寫個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,因為之前我已經(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>")'; } } ... }
查看效果
本次我們實現(xiàn)的是GET請求的xss檢測
nginx -t
通過該命令,測試配置文件沒啥問題。
隨后,重啟nginx服務(wù)
systemctl restart nginx
訪問WEB服務(wù)
一切正常,添加xss參數(shù):http://ip:port/?a=%3Cscript%3E
可以看到直接跳轉(zhuǎn)到403界面,完美實現(xiàn)一個簡單的攔截。
到此這篇關(guān)于基于Nginx+lua實現(xiàn)XSS攻擊攔截的文章就介紹到這了,更多相關(guān)Nginx+lua實現(xiàn)XSS攻擊攔截內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決Nginx 504 Gateway time-out問題
這篇文章主要介紹了完美解決Nginx 504 Gateway time-out問題,需要的朋友可以參考下2014-11-11nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程
下面小編就為大家分享一篇nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程,具有很好的參考價值,希望對大家有所幫助2017-12-12windows下nginx的安裝使用及解決80端口被占用nginx不能啟動的問題
這篇文章主要給大家介紹了關(guān)于windows下nginx的安裝使用,以及如何解決80端口被占用導(dǎo)致nginx不能啟動的問題,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04為高負載網(wǎng)絡(luò)優(yōu)化Nginx和Node.js的方法
如果不先對Nginx和Node.js的底層傳輸機制有所了解,并進行針對性優(yōu)化,可能對兩者再細致的調(diào)優(yōu)也會徒勞無功。一般情況下,Nginx通過TCP socket來連接客戶端與上游應(yīng)用2013-02-02Nginx如何配置Http、Https、WS、WSS的方法步驟
這篇文章主要介紹了Nginx如何配置Http、Https、WS、WSS的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Nginx中return和rewrite的寫法及區(qū)別淺析
在Nginx中,return和rewrite都用于重定向,但有所區(qū)別,return立即終止請求并返回指定HTTP狀態(tài)碼,不額外請求,rewrite則重寫URI并引發(fā)新請求,需要的朋友可以參考下2024-09-09