naxsi

Naxsi

github上,NAXSI自我介绍是Nginx Anti XSS & SQL Injection。顾名思义,他是nginx一个用来防止XSS和SQL注入的Nginx插件。

原来就是将请求的各个参数,通过Naxsi预先设置的规则判断,通过得分,来决定是否拦截。

Install

安装很简单,ubuntu上面只需要apt-get nginx-naxsi就可以啦~其他系统则可以选择官方介绍的,将Naxsi编译进nginx中,wiki上注明需要优先编译Naxsi。

Configuration

  1. 在http{}层,加入include naxsi_core.rules。naxsi_core.rules是naxsi自带的核心规则。可以防止一般的SQL注入和XSS。
  2. 在server{}层,可以动态的设定一些参数。具体见传送门
  3. 在location{}层,可以设置naxsi的开关(是否执行,学习模式[–>观察者模式]),白名单,拦截规则,还有拦截后的重定向。依旧是一个[传送门] (https://github.com/nbs-system/naxsi/wiki/naxsi-setup)。

具体细节

LearningMode是学习模式,开启后,naxsi会在errorLog中打出拦截的请求和拦截的原因,但是并不会真正的拦截请求。因此,使用者可以通过errLog分析得到目前的拦截规则是否适用于服务。

errLog大概长得像这样子

2017/09/15 06:12:33 [error] 18321#0: *291887486 NAXSI_FMT: ip=172.16.1.1&server=a.b.com&uri=/hello&learning=1&vers=0.55.3&total_processed=10086&total_blocked=404&block=1&cscore0=$SQL&score0=8&zone0=ARGS&id0=1000&var_name0=s&zone1=ARGS&id1=1009&var_name1=s, client: 172.16.1.1, server: a.b.com, request: "GET /hello?s=***** HTTP/1.1", host: "a.b.com"

Naxsi认为,请求参数里面s中,有可能存在SQL注入(csore0=$SQL),并且告诉我们,参与判定的规则是1000(id0=1000),有问题的参数是s(var_name0=s),当然出问题的不仅仅是一处时,他将会以平铺的模式,继续追加结果,如上所示。

如果我们认为,这个参数是不存在问题的,可以自己加入白名单。
比如如果我们想要将s这个参数排除在检测之外,则可以加入如下规则:

BasicRule wl:0 "mz:$ARGS_VAR:s|$URL:/hello";

Nxapi

对于大型网站而言,一旦开启了Naxsi,产生的errLog将会极其庞大。Naxsi提供一个方案,来做事件分析,生成相应的白名单。这就是nxapi啦。