leevis.com icon indicating copy to clipboard operation
leevis.com copied to clipboard

nginx 的 WAF 模块 naxsi

Open vislee opened this issue 6 years ago • 0 comments

概述

NAXSI 是开源的一个nginx模块。和ModSecurity 类似。而ModSecurity目前对nginx支持不太好。

  • 编译安装
./auto/configure --add-module=../github.com/nbs-system/naxsi/naxsi_src

指令

规则

NAXSI 提供了灵活的规则配置。先看一份简单可读的规则 有个大概印象后接下来看规则的定义。

规则分为MainRule|main_ruleBasicRule|basic_rule。MainRule 配置在http块下,BasicRule配置在location块下。一般情况下main_rule用来配置规则,basic_rule用来配置白名单。

规则的语法如下图,除了id,其余的部分都必须要用双引号:

rules schema

例如:

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值。 mz rxmz

  • --Whitelists 白名单--

    忽略指定id的规则,在mz的区域不生效。可以用英文逗号指定多条规则。0表示所有规则。<=-1000 则表示 除了该值绝对值的规则,其余大于1000的规则都是白名单规则。"wl:-1003" 表示大等于1000的规则除1003都是白名单规则。

    语法如下:

    Whitelists

    白名单自定义区域不能同时指定$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块下。

语法格式如下: check rule schema

测试

如果配置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'

vislee avatar Mar 02 '18 08:03 vislee