为Lucky开启Coraza WAF防止路径穿越攻击

最近飞牛爆出0day漏洞,在域名后面加上一段特殊路径就可以在没有登录的情况下浏览文件。

虽然飞牛1.1.18已经修复此漏洞,但为了安全考虑,我在反向代理中开启了CorazaWAF,可以有效防止攻击,以下以Lucky为例。

根据官方文档,首先新建一个实例,并添加一条自定义规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
SecRuleEngine On
SecRequestBodyAccess On

SecRule REQUEST_HEADERS:Content-Type "^(?:application(?:/soap\+|/)|text/)xml" \
"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"

SecRule REQUEST_HEADERS:Content-Type "^application/json" \
"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"

SecRule REQUEST_HEADERS:Content-Type "^application/[a-z0-9.-]+[+]json" \
"id:'200006',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"

SecRequestBodyLimit 13107200

SecRequestBodyInMemoryLimit 131072

SecRequestBodyLimitAction Reject

SecRule REQBODY_ERROR "!@eq 0" \
"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"

SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
"id:'200003',phase:2,t:none,log,deny,status:400, \
msg:'Multipart request body failed strict validation."

SecResponseBodyAccess On

SecResponseBodyMimeType text/plain text/html text/xml

SecResponseBodyLimit 524288

SecResponseBodyLimitAction ProcessPartial

SecDataDir /tmp/

SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:(5|4)(0|1)[0-9])$"

SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial

默认的SecRequestBodyLimit为13107200,也就是12.5MB,超过这个大小限制就会报413,对于有外网上传需求的肯定不够用,可以自己根据需求调大这个数字,或者在最前面加上这两行:

1
2
3
# 放在配置文件的最前面
SecRule REQUEST_HEADERS:Content-Type "@contains multipart/form-data" \
"id:200010,phase:1,nolog,pass,ctl:requestBodyAccess=Off"

multipart是大文件上传常用格式,这条规则会对multipart跳过对body的解析。

然后添加第二条规则,类型选OWASP 核心规则集,勾选901、930、949三条规则就能防御路径穿越了,也可以根据需求勾选更多规则。最后呈现的界面应该是这样的(注意规则顺序):

保存实例后,还要去对应的反向代理规则下开启CorazaWAF:

接下来测试规则是否生效:

WAF Protecting

出现这个界面说明规则生效了。