欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Nginx+lua實現(xiàn)簡單的XSS攻擊攔截

 更新時間:2024年01月30日 08:47:46   作者:銀空飛羽  
WAF即web應(yīng)用防火墻,Nginx是一個主流的代理服務(wù),除了本身的Nginx日志,作為用戶肯定也支持對請求信息進行操作,?很多都是通過在代理服務(wù)器上掛載規(guī)則特征,實現(xiàn)軟件層面的軟WAF進行WEB防護,本文主要給大家介紹了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)文章

最新評論