1. wl:

白名单意义:让 naxsi 忽略 指定内容中指定模式的 请求,以避免误杀

白名单指令是 loc | main level

示例:

BasicRule wl:1013 "mz:$ARGS_VAR:term|$URL:/search";


1.2 语法

ngx——naxsi——指令_白名单

1.3 屏蔽ID

wl:0 屏蔽所有规则

wl:42 屏蔽规则42

wl:42,41,43 屏蔽规则42,41,43

wl:-42 屏蔽所有规则,除了 42

注意,不要混淆 负作用 和 正作用 规则

2. rule

rule 指定 在请求的 某个部分 搜索 某个模式匹配,以检测攻击

rule为 loc | main level 指令

语法为

ngx——naxsi——指令_正则_02

示例

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;


3. CheckRules

CheckRules 指挥 naxsi 执行 动作(LOG, BLOCK, DROP, ALLOW)根据该请求相关的某项分数。该项分数通常被一个或多个规则设置。

CheckRules 为 loc level

ngx——naxsi——指令_变量名_03

示例:

若 $SQL 大于等于 8,则 对请求使用 阻塞。

CheckRule "$SQL >= 8" BLOCK;


4. DeniedUrl

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

ngx——naxsi——指令_sql_04

动态情况,需要正则的情况

ngx——naxsi——指令_naxsi_05

注意:你不能 混合使用 正则(如 $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;
}