白名单意义:让 naxsi 忽略 指定内容中指定模式的 请求,以避免误杀
白名单指令是 loc | main level
示例:
BasicRule wl:1013 "mz:$ARGS_VAR:term|$URL:/search";
1.2 语法
1.3 屏蔽ID
wl:0 屏蔽所有规则
wl:42 屏蔽规则42
wl:42,41,43 屏蔽规则42,41,43
wl:-42 屏蔽所有规则,除了 42
注意,不要混淆 负作用 和 正作用 规则
2. rulerule 指定 在请求的 某个部分 搜索 某个模式匹配,以检测攻击
rule为 loc | main level 指令
语法为
示例
MainRule id:424242 "str:zz" "mz:ARGS|BODY" "s:DROP";
2.1 id:num
设置规则ID,将用于 NAXSI_FMT 或 白名单。
小于 1000 的ID 被保留作为 内部规则
2.2 匹配模式
四种方法:
str:foo|bar : 字符串匹配
rx:foo|bar : 正则
d:libinj_xss : 语法分析xss
d:libinj_sql : 语法分析sql
推荐尽量使用 字符串匹配,因为更快,所有字符串必须小写,因为 naxsi不区分大小写
2.3 s:...
你可以创建一个 带名称计数器 s:$FOOBAR:4 ,会让 $FOOBAR 加4。
规则 s:$FOO:4,$BAR:8 让 $FOO 加4 ,$BAR 加8。
规则也可以直接 指定一个动作 如:BLOCK(非学习模式下阻塞请求),或 DROP(阻塞请求即使在学习模式),该动作 将在 CheckRules 指令为真后执行。
2.4 mz:...
mz定义 匹配域(请求中哪些部分被规则检测)
2.5 msg:...
描述 模式,多用于分析的人可读信息
2.6 negative
negative是关键字,用于构造 反式规则,当规则不匹配时,增加分数
MainRule negative "rx:multipart/form-data|application/x-www-form-urlencoded" "msg:Content is neither mulipart/x-www-form.." "mz:$HEADERS_VAR:Content-type" "s:$EVADE:4" id:1402;
CheckRules 指挥 naxsi 执行 动作(LOG, BLOCK, DROP, ALLOW)根据该请求相关的某项分数。该项分数通常被一个或多个规则设置。
CheckRules 为 loc level
示例:
若 $SQL 大于等于 8,则 对请求使用 阻塞。
CheckRule "$SQL >= 8" BLOCK;
DeniedUrl 指定 一个请求阻塞时 重定向的url。
因为重定向期间,请求可能被修改(url和args部分),所以添加额外的 http header : orig_url(原始url) org_args(原始GET参数) 和 naxsi_sig(NAXSI_FMT)
如果 $naxsi_flag_post_action 被设置为 1,naxsi会执行 post_action
4. 匹配域match zones mz 用于 rules 和 whitelists,用于设置,什么那部分应被模式搜索,哪部分应该被允许。
请注意 mz 在rules 和 whitelists 有一点不同:
在 rules中,所有条件是 OR(如 in BORY OR in HEADERS),
在 whitelists 中,条件是 AND (如 url 必须是 /foo 并且 例外 必须发生在 ARGS 中)
4.1 全局 zone
4个主要zone:URL, ARGS, HEADERS, BODY。并且 匹配域 多少有些限制。
一个 mz 可以 泛设置
ARGS: GET参数
HEADERS : HTTP headers
BODY : POST args (和 RAW_BODY)
URL : URL本身(在'?' 前)
或者 详细设置
$ARGS_VAR:string : 明确名称的 GET args
$BODY_VAR:string : 明确名称的 POST args
$HEADERS_VAR:string : 明确名称的 HTTP header
可以用正则表达式(如 变量名称会改变情况)
$HEADERS_VAR_X:regex
$ARGS_VAR_X:regex
$BODY_VAR_X:regex
一个域被限制 url
$URL:string : 限制于该url
$URL_X:regex
域为 BODY,HEADERS,ARGS 的 mz,可以追加 |NAME ,以说明 目标不是变量的内容,而是变量名称。
BasicRule id:1310,1311 "mz:$URL:/foo|BODY|NAME";
更多mz:
FILE_EXT : 文件名(用于 multipart POST 包含文件)
RAW_BODY : 未解析的 请求体
4.2 匹配域
一个 匹配域 由 一个或多个 zone 和 一个可选的 url 组成。
多数情况下,变量名和 url 可以预先知道,那么可以创建一个静态的 mz
动态情况,需要正则的情况
注意:你不能 混合使用 正则(如 $URL_X) 和 静态(如$ARGS_VAR)在一条规则
$URL 和 $URL_X 只能被用于 限制 matchzone 的 作用对象范围,不是 描述 zone
4.3 白名单 matchzones
白名单上文中,所有的条件必须满足:
BasicRule wl:X "mz:$ARGS_VAR:foo|$URL:/bar";
当 url为 /bar的请求,若 GET有 参数foo,则 白名单为 id为X的规则
4.4 rules matchzones
在rules上下文中,$URL 和 $URL_X 条件必须满足, 其它 条件被视为 OR (和 白名单上下文相反)。
BasicRule str:Y id:X "mz:ARGS|BODY";
模式'Y' 会匹配 任何 GET 或 POST 参数
BasicRule str:Y id:X "mz:ARGS|BODY|$URL:/foo";
模式'Y' 匹配 url为/foo,且 模式匹配 GET或 POST参数
4.5 正则 vs 字符串 匹配
由 静态 matchzones(如 $_VAR: $URL:) 组成的 matchzones 被存储到 哈希表中,因此 这是最优的。
正则mathzones(如 $_VAR_X: $URL_X:)需要 更多 运行时处理。
不能将 static 和 regex matchzones 混合写到一个 rule/whitelist
如:
mz:$ARGS_VAR_X:^foo$|$URL:/x or mz:$URL_X:/foo|$ARGS_VAR:x
是错误的
4. IgnoreIP IgnoreCIDR你可以列出哪些 永不屏蔽主机的 IP 或 CIDR(如 192.168.3.1/24)
用于判断的 IP 从 X-Forwarder-for 获得(若存在的话,否则使用 Client IP )
如果你使用了 代理服务器,则可以用指令proxy_set_header X-Forwarded-For $remote_addr; 让代理服务器会添加 X-Forwarder-for
示例
location / {
SecRulesEnabled;
IgnoreIP "1.2.3.4";
IgnoreCIDR "192.168.0.0/24";
DeniedUrl "/RequestDenied";
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
root /var/www/html/;
index index.html index.htm;
}