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

admin 2023年12月27日23:16:13评论28 views字数 2410阅读8分2秒阅读模式

写在前面

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

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

关于更详细的内容,均可参考该网站文档进行学习:

https://www.kancloud.cn/allanyu/openresty-best-practices/82569

Lua

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

Nginx对Lua的支持

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

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

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

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

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

sudo apt updatesudo 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 falseend

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) endend

    可以看到,我写了一个xss的检测函数has_xss,当然规则比较简单。同时接下来,用了ngx.req.read_body()函数,当你需要处理HTTP请求时,必须优先调用该函数,随后才可以获取HTTP的请求数据。

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

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

挂载Lua

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

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

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

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,

<!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相关配置如下

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检测

nginx -t

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

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

随后,重启nginx服务

systemctl restart nginx

    访问WEB服务

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

一切正常,添加xss参数:

http://ip:port/?a=%3Cscript%3E

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

可以看到直接跳转到403界面,完美实现攻击拦截。


END



原文始发于微信公众号(飞羽技术工坊):Nginx进行lua扩展,实现简易的攻击拦截(软WAF)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月27日23:16:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nginx进行lua扩展,实现简易的攻击拦截(软WAF)http://cn-sec.com/archives/2338445.html

发表评论

匿名网友 填写信息