小百科,大世界
首页 / 计算机 / IT资讯

Nginx进行lua扩展实现简易的攻击拦截软WAF 繁體

写在前面

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 模块来提供的。

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

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

        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

            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服务

                    systemctl restart nginx
                          

                    访问WEB服务

                    一切正常,添加xss参数:

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

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


                      END

                      首页 / 计算机 / IT资讯
                      相关连接:
                      Prev:
                      2024年七大网络安全威胁
                      CVE202351467Apache OFBiz
                      如何应对新兴技术带来的安全隐患
                      Next:
                      1恶意 npm 软件包利用隐藏的 Kill Switch 开发人员工具
                      0工信部认可360荣获车联网产品安全漏洞专业库优秀技术支撑单位
                      1Ivanti Endpoint Manager 修补关键安全漏洞
                      0CVE20250147Zoom 修复高严重性安全漏洞
                      5以亚马逊 S3 存储桶为目标的勒索软件活动
                      资源来自网络,仅供参考