跳转至

ngx_lua_waf规则语法

ngx_lua_waf 防火墙规则中,argsposturl 等规则文件的匹配语法主要基于 PCRE(Perl Compatible Regular Expressions,Perl 兼容正则表达式),并结合 Lua 的 ngx.re.match 进行匹配。

以下是详细的语法规则和匹配方式:

1. 规则文件语法

ngx_lua_waf 的规则文件(如 argsposturluser-agent 等)遵循以下格式:

  • 每行一条规则,逐行匹配。
  • 支持正则表达式(PCRE 语法)。
  • 空行会被忽略。
  • # 开头的行被视为注释,不会生效。

示例规则文件(args 文件)

Bash
1
2
3
4
5
6
7
8
9
# 阻止 SQL 注入
select.+from
insert.+into
update.+set
delete.+from
drop.+(table|database)
union.+select
--\s+
/\*.*\*/

2. 匹配方式

ngx_lua_waf 使用 ngx.re.match(基于 PCRE)进行匹配,语法如下:

Bash
local ngxmatch = ngx.re.match
local is_match = ngxmatch(subject, pattern, "isjo")
  • subject:要匹配的字符串(如 ngx.var.request_uringx.var.http_user_agent 等)。
  • patternPCRE 正则表达式。
  • "isjo":匹配选项:

  • i:不区分大小写(case-insensitive)。

  • s.匹配换行符(dot matches newline)。
  • j:启用 PCRE JIT 编译(提升性能)。
  • o:仅编译一次(compile once)。

3. 不同规则文件的匹配目标

规则文件 匹配目标 示例
args ngx.req.get_uri_args()(GET 参数) ?id=1' OR 1=1--
post ngx.req.get_post_args()(POST 数据) username=admin'--
url ngx.var.request_uri(请求 URI) /wp-admin.php
user-agent ngx.var.http_user_agent(User-Agent) sqlmap/1.6#dev
cookie ngx.var.http_cookie(Cookie) sessionid=1' AND 1=1--

4. 示例:args 规则匹配

Bash
function args()
    local args = ngx.req.get_uri_args() -- 获取 GET 参数
    for key, val in pairs(args) do
        if type(val) == "table" then
            val = table.concat(val, " ")
        end
        for _, rule in pairs(argsrules) do
            if rule ~= "" and ngxmatch(unescape(val), rule, "isjo") then
                log('GET', ngx.var.request_uri, "-", rule)
                say_html() -- 返回拦截页面
                return true
            end
        end
    end
    return false
end
  • ngx.req.get_uri_args() 获取 GET 参数。
  • ngxmatch(unescape(val), rule, "isjo") 进行正则匹配。

5. 常见正则规则

攻击类型 正则示例 说明
SQL 注入 select.+from 匹配 select * from users
XSS 攻击 <script>.*</script> 匹配 <script>alert(1)</script>
目录遍历 \.\./ 匹配 ../../etc/passwd
命令注入 \|\|.* 匹配 cat /etc/passwd
扫描工具 sqlmap nmap nikto 匹配 User-Agent: sqlmap

6. 调试与优化

(1)检查规则是否生效

tail -f /usr/local/openresty/nginx/logs/error.log

(2)测试规则

curl "http://example.com/?id=1' OR 1=1--"

如果规则匹配,会返回拦截页面(如 444 状态码)

(3)优化性能

  • 避免过度复杂的正则(如 .*.* 可能导致 ReDoS)。
  • 使用 ipairs 替代 pairs(遍历数组时更高效)。

总结

  • ngx_lua_waf 的规则文件采用 PCRE 正则语法。
  • ngx.re.match 负责匹配,支持 isjo 选项。
  • 不同规则文件(argsposturl)匹配不同请求部分。
  • 规则文件每行一条正则,空行和 # 开头的行被忽略。

如果你的规则未生效,请检查:

  1. 规则文件路径是否正确(RulePath 配置)。
  2. OpenResty 是否有权限读取规则文件。
  3. 正则表达式是否正确(可用 regex101.com 测试)。