Nginx进行lua扩展,实现简易的攻击拦截(软WAF)

写在前面

WAF即web应用防火墙。

Nginx是一个主流的代理服务,之前记录过它的四层、七层代理。既然流量都经过Nginx了,那除了本身的Nginx日志,作为用户肯定也支持对请求信息进行操作。 尤其是在安全领域,很多都是通过在代理服务器上挂载规则特征,实现软件层面的软WAF进行WEB防护。

这次主要就是记录一下Nginx+Lua实现一个简单的XSS攻击拦截。

关于更详细的内容,均可参考该网站文档进行学习:www.kancloud.cn/allanyu/ope...

Lua

关于Lua,它是一个脚本语言,因为它极其轻量级,所以一般广泛应用于游戏脚本等高性能的领域。Nginx也有专门对Lua脚本支持的模块,后续的软WAF实现主要就是依赖于Nginx挂载Lua脚本,关于Lua的语法比较简单,可以参考上述文档,不过多赘述。

Nginx的Lua支持

Nginx本身就是模块化的,可以针对模块进行增加修改。那么对于lua的能力支持,主要就是 ngx_http_lua_module 模块来提供的。

bash 复制代码
location /lua {
	default_type "text/html";
	content_by_lua 'ngx.say("<h1>hello world</h1>")';
}

如果发现不能成功执行,这里便用如下命令,手动安装一下扩展再试试

bash 复制代码
sudo apt update
sudo apt install nginx-extras

XSS检测lua脚本

这里我写了一个简单XSS检测,直接上代码

lua 复制代码
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,当然规则比较简单。同时接下来,用了ngx.req.read_body()函数,当你需要处理HTTP请求时,必须优先调用该函数,随后才可以获取HTTP的请求数据。

这里调用过该函数后,我取到了uri的参数数据,当然也可以通过ngx.req.get_post_args()获取post参数,也可以通过ngx.req.get_body_data()来获取请求数据,更多的用法函数可以参考最上方的文档进行查询。

最后就是循环遍历参数并执行has_xss进行判断,如果发现命中匹配字符,则返回FORBIDDEN也就是403状态码。

挂载Lua

这里我的lua脚本路径为:/home/ssremex/nginx_lua/xss_check.lua

打开nginx的配置文件 /etc/nginx/nginx.conf

bash 复制代码
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脚本挂载到根路由下。

同时,因为咱们定义了拦截返回状态码403,所以希望拦截的时候能够返回这个页面,先简单写个403页面 attack_403.html,

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WARNNING</title>
</head>
<body>
<h1>发现攻击,已禁止</h1>
</body>
</html>

在nginx.conf中配置上error_page,因为之前我已经设定了web的全局跟路径root,所以我直接将attack_403.html文件放到根路径下也就是home_demo下,路径为/home/ssremex/home_demo/attack_403.html

nginx相关配置如下

bash 复制代码
http {
	...
    server {
            listen 8088; # 更换成自己像监听的端口
            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检测

bash 复制代码
nginx -t

通过该命令,测试配置文件没啥问题。

随后,重启nginx服务

bash 复制代码
systemctl restart nginx

访问WEB服务

一切正常,添加xss参数:http://ip:port/?a=%3Cscript%3E

可以看到直接跳转到403界面,完美实现一个简单的拦截。

相关推荐
IT_陈寒42 分钟前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x1 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者2 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重2 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780512 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还2 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy882 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
Fireworks3 小时前
深入vue3源码解读 -- 1、响应式的基础概念
前端
程序员黑豆3 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
hunterandroid3 小时前
文件存储:内部存储与外部存储
前端