leevis.com
leevis.com copied to clipboard
nginx 的 WAF 模块 naxsi
概述
NAXSI 是开源的一个nginx模块。和ModSecurity 类似。而ModSecurity目前对nginx支持不太好。
- 编译安装
./auto/configure --add-module=../github.com/nbs-system/naxsi/naxsi_src
指令
规则
NAXSI 提供了灵活的规则配置。先看一份简单可读的规则 有个大概印象后接下来看规则的定义。
规则分为MainRule|main_rule
和BasicRule|basic_rule
。MainRule 配置在http块下,BasicRule配置在location块下。一般情况下main_rule用来配置规则,basic_rule用来配置白名单。
规则的语法如下图,除了id,其余的部分都必须要用双引号:
例如:
MainRule id:4242 "str:z" "s:$RFI:8" "mz:$ARGS_VAR:X|BODY";
BasicRule "wl:4242" "mz:$BODY_VAR:test";
-
id:num
: 唯一的数字标识,小于1000的保留。标识被用于NAXSI_FMT
或 whitelists 。 -
Match Pattern: 匹配的模式
-
rx:reg
正则匹配 -
str:string
字符串匹配 -
d:libinj_xss
xss注入 -
d:libinj_sql
sql注入
-
-
Score (s:...) : 匹配以后的动作或打分。可以创建一个或多个变量进行打分累加(配合Checkrules指令),或者配置动作(BLOCK、ALLOW......)
-
MatchZone (mz:...): 匹配规则的域,也就是指定请求的哪一部分匹配规则。
其中NAME是指ARGS\HEADERS等的key匹配,而不是key对应的val值。
-
--Whitelists 白名单--
忽略指定id的规则,在mz的区域不生效。可以用英文逗号指定多条规则。0表示所有规则。<=-1000 则表示 除了该值绝对值的规则,其余大于1000的规则都是白名单规则。"wl:-1003" 表示大等于1000的规则除1003都是白名单规则。
语法如下:
白名单自定义区域不能同时指定$ARGS_VAR 和$HEADER_VAR 和$BODY_VAR。 但是$URL 可以和 $ARGS_VAR、$HEADER_VAR 、$BODY_VAR 同时指定。如:
basic_rule "wl:1002" "mz:$ARGS_VAR:bb|$URL:/test";
CheckRule(check_rule)指令
该指令配置在loction块下。
语法格式如下:
测试
如果配置rules_disabled,可以通过设置变量$naxsi_flag_enable动态开启,要注意变量赋值的阶段。
http {
include mime.types;
default_type application/octet-stream;
MainRule id:1001 "str:liwq" "msg: test liwq" "mz:$HEADERS_VAR:Cookie" "s:$SQL:2";
MainRule id:1002 "str:0x" "msg:0x, possible hex encoding" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:2";
server {
listen 8080;
server_name localhost;
location / {
SecRulesEnabled;
DeniedUrl "/RequestDenied";
CheckRule "$SQL >= 4" BLOCK;
proxy_pass http://liwq.applinzi.com/;
}
location /RequestDenied {
return 412;
}
}
}
---测试 curl -v '127.0.0.1:8080/' -H'cookie: liwq' -H'cookie: 0x'