ngx_lua_waf规则语法¶
在 ngx_lua_waf 防火墙规则中,args、post、url 等规则文件的匹配语法主要基于 PCRE(Perl Compatible Regular Expressions,Perl 兼容正则表达式),并结合 Lua 的 ngx.re.match 进行匹配。
以下是详细的语法规则和匹配方式:
1. 规则文件语法¶
ngx_lua_waf 的规则文件(如 args、post、url、user-agent 等)遵循以下格式:
- 每行一条规则,逐行匹配。
- 支持正则表达式(PCRE 语法)。
- 空行会被忽略。
- 以
#开头的行被视为注释,不会生效。
示例规则文件(args 文件)
| Bash | |
|---|---|
2. 匹配方式¶
ngx_lua_waf 使用 ngx.re.match(基于 PCRE)进行匹配,语法如下:
subject:要匹配的字符串(如ngx.var.request_uri、ngx.var.http_user_agent等)。pattern:PCRE正则表达式。-
"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 规则匹配¶
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选项。- 不同规则文件(
args、post、url)匹配不同请求部分。 - 规则文件每行一条正则,空行和
#开头的行被忽略。
如果你的规则未生效,请检查:
- 规则文件路径是否正确(
RulePath配置)。 OpenResty是否有权限读取规则文件。- 正则表达式是否正确(可用 regex101.com 测试)。