nginx利用lua语言实现软waf的示例代码

 更新时间:2024年03月04日 11:43:36   作者:475.35  
这篇文章主要介绍了nginx利用lua语言实现软waf,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

首先下载nginx的安装包:

wget http://nginx.org/download/nginx-1.14.0.tar.gz

这里下载的是nginx1.14的包,感觉安装包太老的话可以去官网下载新的版本:

官网地址:http://nginx.org/

但是我这里测试使用的不是nginx的安装包,而是使用的淘宝开发师提供的OpenResty;

其官方网站OpenResty® - Open source我们读起来是非常的方便。OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。

用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。所以本身OpenResty内部就已经集成了Nginx和Lua,所以我们使用起来会更加方便。

下载OpenResty:

wget https://openresty.org/download/openresty-1.19.3.2.tar.gz

解压缩:

tar -zxvf openresty-1.19.3.2.tar.gz && cd openresty-1.19.3.2

编译安装:

./configure && make && make install

进入OpenResty的目录,找到nginx:

cd /usr/local/openresty/nginx/

在conf目录下的nginx.conf添加如下内容:

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

通过浏览器访问测试:

测试nginx没问题后,就开始本次实验:

利用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,当然规则比较简单。同时接下来,用了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/gsl/xss_check.lua

打开nginx的配置文件:

/usr/local/openresty/nginx/conf/nginx.conf

在配置文件中添加location:

            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>")';
            }

这里将默认的发布文件目录修改为/home/gsl,因为在这里我还有两个html文件;

接下来那就是要编写html文件了:

第一个是发现uri不正确/检测到有问题的,需要提醒被攻击,这个html文件的路径为:

/home/gsl/attack_403.html

html代码如下:

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

另外一个就是如果检测到正确就访问index文件:

路径为:/home/gsl/index.html

html代码如下(我这里为了测试找了一个简单的代替):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的网页</title>
</head>
<body>
    <h1>这是标题</h1>
    <p>这是段落。</p>
 
    <!-- 在此处添加其他内容 -->
 
</body>
</html>

nginx.conf的配置文件也像上边一样配置完成,那么这时就可以使用Nginx命令来检测一下nginx的语法是否正确,并且重新加载一下配置文件:

我这里是编译安装的nginx,并且也没有将nginx的可执行文件配置在/usr/sbin(已经配置的环境变量)目录下,所以我需要进入:/usr/local/openresty/nginx/sbin下执行命令

./nginx -t

nginx -s reload

然后正常访问一下:

添加xss参数模拟一下错误:

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

已经被检测到;

OK,本次实验结束;

以上就是nginx利用lua语言实现软waf的示例代码的详细内容,更多关于nginx lua实现软waf的资料请关注脚本之家其它相关文章!

相关文章

  • Nginx跨域访问配置方式(Web反向代理跨域访问配置)

    Nginx跨域访问配置方式(Web反向代理跨域访问配置)

    这篇文章主要介绍了Nginx跨域访问配置方式(Web反向代理跨域访问配置),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Nginx Rewrite使用场景及配置方法解析

    Nginx Rewrite使用场景及配置方法解析

    这篇文章主要介绍了Nginx Rewrite使用场景及配置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Nginx配置使用详解

    Nginx配置使用详解

    Nginx是一个高性能的HTTP和反向代理web服务器。本文详细讲解了Nginx配置使用的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • nginx反向代理60s超时报错问题解决

    nginx反向代理60s超时报错问题解决

    本文主要介绍了Nginx反向代理时遇到60秒超时报错的问题,经过排查发现是由于代理服务执行时间过长导致的,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • shell脚本实战之部署nginx脚本实例

    shell脚本实战之部署nginx脚本实例

    最近自己编写的Linux一键部署脚本,可以一键部署Nginx,分享给大家,这篇文章主要给大家介绍了关于shell脚本实战之部署nginx脚本的相关资料,需要的朋友可以参考下
    2022-12-12
  • 教你如何快速搭建和配置 Nginx 服务器

    教你如何快速搭建和配置 Nginx 服务器

    Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器,本文将详细介绍如何在 Linux 上安装、配置和管理 Nginx 服务器,感兴趣的朋友一起看看吧
    2024-07-07
  • Nginx部署https网站并配置地址重写的步骤详解

    Nginx部署https网站并配置地址重写的步骤详解

    今天小编就为大家分享一篇关于Nginx部署https网站并配置地址重写的步骤详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Nginx代理导致请求头某些内容丢失的问题解决

    Nginx代理导致请求头某些内容丢失的问题解决

    本文主要介绍了在使用NGINX代理时请求头中的下划线被自动忽略的问题,通过两种方法解决了这个问题,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • nginx全局块的user指令的实现示例

    nginx全局块的user指令的实现示例

    user用于配置运行Nginx服务器的worker进程的用户和用户组,本文主要介绍了nginx全局块的user指令的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • ubuntu中如何使用nginx监听80端口进行转发

    ubuntu中如何使用nginx监听80端口进行转发

    这篇文章主要介绍了ubuntu中如何使用nginx监听80端口进行转发问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论