概述
NAXSI means Nginx Anti XSS & SQL Injection。NAXSI 是 Nginx 模块,用于防止跨站攻击、SQL 注入。
安装
1 | # 下载 |
基础配置
nginx.conf
:
1 | #user nobody; |
测试命令:
1 | curl 'http://127.0.0.1:8080/naxsi_test?a=<>' |
可以从日志中看到 naxsi 输出。
命令说明
在 Naxsi 内同时有 Naxsi 风格和 NGINX 风格的指令,左右是相同的。
1. MainRule/main_rule
定义一条规则或白名单。
2. BasicRule/basic_rule
定义一条规则或白名单。
3. DeniedUrl/denied_url
指示 naxsi 将 BLOCK
的请求重定向 DeniedUrl
指定的位置。
示例:
1 | location / { |
4. CheckRule/check_rule
定义当分值达到阈值采取的动作。可采取动作:
1 | LOG, BLOCK, DROP, ALLOW |
5. LearningMode/learning_mode
6. SecRulesEnabled/rules_enabled
SecRulesEnabled
用来指示当前 location 是否启用 NAXSI 检查。
7. SecRulesDisabled/rules_disabled
SecRulesDisabled
在当前 location 禁用 NAXSI 检查。
8. LibInjectionSql/libinjection_sql
开启 SQL 注入检测。
9. LibInjectionXss/libinjection_xss
开启跨站攻击检查。
NAXSI 规则指令处理函数
1. SCORE_T 指令处理
SCORE_T
定义:
1 |
可选值以及相应处理结果:
可选值 | 处理结果 | |
---|---|---|
BLOCK |
本规则 block 位置 1 |
|
DROP |
本规则 drop 位置 1 |
|
ALLOW |
本规则 allow 位置 1 |
|
LOG |
本规则 log 位置 1 |
|
[-][0-9] |
计算出相应数值 |
2. ID_T 指令处理
ID_T
定义:
1 |
功能:计算本规则的 ID 号
3. MSG_T 指令处理
MSG_T
定义:
1 |
功能:msg
用来定义当前规则的描述信息。
4. RX_T 指令处理
RX_T
定义:
1 |
功能:rx
用于定义正则表达式,内部会预先编译为正则表达式对象,并将其存储在 rule->br->rx
中。
5. STR_T 指令处理
STR_T
定义:
1 |
功能:str
用于定义字符串匹配,内部使用小写字母表示字符串以忽略大小写,并使 rule->br->str
指向转换后的小写字符串。
6. LIBINJ_XSS_T 指令处理
LIBINJ_XSS_T
定义:
1 |
功能:
仅指定本规则为 xss
类型。rule->br->match_type = LIBINJ_XSS
本规则对 GET 请求中 foo 参数进行跨站攻击检查,如果检测到跨站攻击则 DROP 请求。
1 | MainRule "id:4241" "s:DROP" "d:libinj_xss" "mz:$ARGS_VAR:foo"; |
7. LIBINJ_SQL_T 指令处理
LIBINJ_SQL_T
定义:
1 |
功能:
仅指定本规则为 SQL 注入类型。rule->br->match_type = LIBINJ_SQL
本规则对 GET 请求中 foo 参数进行 SQL 注入检查,如果检测到 SQL 注入则 DROP 请求。
1 | MainRule "id:4241" "s:DROP" "d:libinj_sql" "mz:$ARGS_VAR:foo"; |
8. MATCH_ZONE_T 指令处理
MATCH_ZONE_T
定义:
1 |
功能:mz
指令用于指定用于匹配的区域。支持:RAW_BODY、BODY、HEADERS、URL、ARGS、NAME、FILE_EXT;用户自定义 ARGS_VAR、HEADERS_VAR、BODY_VAR、URL;以及支持正则表达式的用户自定义区域 ARGS_VAR、HEADERS_VAR、BODY_VAR、URL。
用户自定义、支持正则表达式的用户自定义区域会将值保存在 custom_rule->target
中。
9. NEGATIVE_T 指令处理
NEGATIVE_T
定义:
1 |
功能:rule->br->negative = 1
以下规则将所有请求的 URL 不是以 rest 开头的请求 DROP 掉:
1 | MainRule "id:4241" negative "s:DROP" "rx:^/rest/" "mz:URL"; |
10. WHITELIST_T 指令处理
WHITELIST_T
定义:
1 |
功能:
白名单规则列表,使用动态数组保存。
NAXSI 模块指令处理
1. MainRule/main_rule 指令处理函数
MAIN
级别的全局定义。
1 | static char * |
2. BasicRule/basic_rule 指令处理函数
LOCATION
级别的规则定义,当前 LOCATION
使用。
1 | /* |
3. 请求处理函数
在 postconfig
阶段设置 ACCESS
阶段处理函数:
1 | static ngx_int_t |
3. 规则匹配函数
ngx_http_apply_rulematch_v_n
函数的思路是首先判断当前规则、条件是否满足白名单,如果满足则不需要继续进行。如果不满足则根据当前规则进行打分、设置状态(BLOCK、DROP、ALLOw)。
1 | int |
总结
naxsi 代码逻辑或者对 WAF 抽象不够,使用 naxsi 构建 WAF 并不如使用 OpenResty 构建,OpenResty 更加灵活。