基于Nginx+lua實現簡單的XSS攻擊攔截
Lua
關于Lua,它是一個腳本語言,因為它極其輕量級,所以一般廣泛應用于游戲腳本等高性能的領域。Nginx也有專門對Lua腳本支持的模塊,后續(xù)的軟WAF實現主要就是依賴于Nginx掛載Lua腳本,關于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ā)現不能成功執(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的檢測函數has_xss,當然規(guī)則比較簡單。同時接下來,用了ngx.req.read_body()函數,當你需要處理HTTP請求時,必須優(yōu)先調用該函數,隨后才可以獲取HTTP的請求數據。
這里調用過該函數后,我取到了uri的參數數據,當然也可以通過ngx.req.get_post_args()獲取post參數,也可以通過ngx.req.get_body_data()來獲取請求數據,更多的用法函數可以參考最上方的文檔進行查詢。
最后就是循環(huán)遍歷參數并執(zhí)行has_xss進行判斷,如果發(fā)現命中匹配字符,則返回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ā)現攻擊,已禁止</h1> </body> </html>
在nginx.conf中配置上error_page,因為之前我已經設定了web的全局跟路徑root,所以我直接將attack_403.html文件放到根路徑下也就是home_demo下,路徑為/home/ssremex/home_demo/attack_403.html
nginx相關配置如下
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>")'; } } ... }
查看效果
本次我們實現的是GET請求的xss檢測
nginx -t
通過該命令,測試配置文件沒啥問題。
隨后,重啟nginx服務
systemctl restart nginx
訪問WEB服務
一切正常,添加xss參數:http://ip:port/?a=%3Cscript%3E
可以看到直接跳轉到403界面,完美實現一個簡單的攔截。
到此這篇關于基于Nginx+lua實現XSS攻擊攔截的文章就介紹到這了,更多相關Nginx+lua實現XSS攻擊攔截內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
完美解決Nginx 504 Gateway time-out問題
這篇文章主要介紹了完美解決Nginx 504 Gateway time-out問題,需要的朋友可以參考下2014-11-11nginx+tomcat實現Windows系統下的負載均衡搭建教程
下面小編就為大家分享一篇nginx+tomcat實現Windows系統下的負載均衡搭建教程,具有很好的參考價值,希望對大家有所幫助2017-12-12windows下nginx的安裝使用及解決80端口被占用nginx不能啟動的問題
這篇文章主要給大家介紹了關于windows下nginx的安裝使用,以及如何解決80端口被占用導致nginx不能啟動的問題,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04Nginx如何配置Http、Https、WS、WSS的方法步驟
這篇文章主要介紹了Nginx如何配置Http、Https、WS、WSS的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05Nginx中return和rewrite的寫法及區(qū)別淺析
在Nginx中,return和rewrite都用于重定向,但有所區(qū)別,return立即終止請求并返回指定HTTP狀態(tài)碼,不額外請求,rewrite則重寫URI并引發(fā)新請求,需要的朋友可以參考下2024-09-09