0x01 简介
ModSecurity是一个开源的、跨平台的Web应用防火墙,它可以通过检查Web服务接收到的数据,以及发送出去的数据来对网站进行安全防护。
ModSecurity有以下作用:
SQL Injection (SQLi):阻止SQL注入
Cross Site Scripting (XSS):阻止跨站脚本攻击
Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击
Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击
Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击
PHP Code Injectiod:阻止PHP代码注入
HTTP Protocol Violations:阻止违反HTTP协议的恶意访问
HTTPoxy:阻止利用远程代理感染漏洞进行攻击
Sshllshock:阻止利用Shellshock漏洞进行攻击
Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击
Scanner Detection:阻止黑客扫描网站
Metadata/Error Leakages:阻止源代码/错误信息泄露
Project Honey Pot Blacklist:蜜罐项目黑名单
GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断
0x02 规则介绍
根据配置手册,我们了解到分为这几部分,包含配置指令,处置阶段、变量、转换函数、动作以及运算符。看过规则追后,个人感觉转换函数这个规则部分在自建规则这里使用不到,简单总结一下部分会用到的规则以及动作。
配置指令
SecRules
创建一个使用所选运算符分析指定变量的规则。
SecRule VARIABLES OPERATOR [ACTIONS]
eg:
SecRule ARGS "@rx attack" "phase:1,log,deny,id:1"
处理阶段
ModSecurity 2.x允许将规则置于Apache请求周期的以下五个阶段之一:
请求头(REQUEST_HEADERS)
请求体(REQUEST_BODY)
响应头(RESPONSE_HEADERS)
响应体(RESPONSE_BODY)
日志记录(LOGGING)
五个阶段图示如下:
变量
- ARGS
ARGS是一个集合,可以通过静态参数(匹配带有该名称的参数),或是通过正则表达式(匹配所有带有与正则表达式匹配的名称的参数)进行单独使用(包含所有参数,包括POST Payload),eg:(下面的“id”都为规则的id序号)
SecRule ARGS dirty "id:7" #检查dirty所有请求参数的值
SecRule ARGS:p dirty "id:8" #查看名为p的参数的值(请注意,通常,请求可以包含多个具有相同名称的参数) ":"表示运算符
SecRule ARGS|!ARGS:z dirty "id:9" #检查单词dirty的所有请求参数的值,除了名为z的那些(同样,可以有零个或多个名为z的参数):
- Files
包含原始文件名的集合(因为它们是在远程用户的文件系统上调用的),eg:
SecRule FILES "@rx .conf$" "id:xxx"
- FILES_NAMES
包含用于文件上载的表单字段列表,eg:
SecRule FILES_NAMES "^upfile$" "id:xxx"
- PATH_INFO
包含额外的请求URI信息,也称为路径信息。eg:
SecRule PATH_INFO "^/(bin|etc|sbin|opt|usr)" "id:xxx"
- REMOTE_ADDR
此变量包含远程客户端的IP地址。eg:
SecRule REMOTE_ADDR "@ipMatch 192.168.1.101" "id:xxx"
- REMOTE_PORT
此变量包含有关客户端在启动与Web服务器的连接时使用的源端口的信息。。eg:
SecRule REMOTE_PORT "@lt 1024" "id:xxx"
- REMOTE_USER
此变量包含经过身份验证的用户的用户名。eg:
SecRule REMOTE_USER "@streq admin" "id:xxx"
- REQBODY_PROCESSOR
包含当前使用的请求体处理器的名称。可能的值是URLENCODED,MULTIPART和XML。eg:
SecRule REQBODY_PROCESSOR "^XML$ chain,id:xxx
SecRule XML "@validateDTD /opt/apache-frontend/conf/xml.dtd"
- REQUEST_BASENAME
该变量仅包含REQUEST_FILENAME的文件名部分(例如,index.php)。eg:
SecRule REQUEST_BASENAME "^login.php$" phase:2,id:xxx,t:none,t:lowercase
- REQUEST_BODY
包含原始请求体。仅当使用URLENCODED请求体处理器时该变量才有效,即,当检测到application / x-www-form-urlencoded内容类型时,或者强制使用URLENCODED请求体解析器时,此变量才有效。
SecRule REQUEST_BODY "^username=\w{25,}\&password=\w{25,}\&Submit\=login$" "id:xxx"
- REQUEST_COOKIES
此变量是所有请求cookie的集合(仅包含值)。eg:
SecRule &REQUEST_COOKIES "@eq 0" "id:xxx" #请求中没有任何Cookie头
动作
- chain
使用紧随其后的规则与当前规则进行链接,形成规则链。链式规则允许更复杂的处理逻辑
拒绝接受不包含Content-Length标头或Content-Length的值为0的POST请求。
(请注意,此规则应在规则之前验证仅使用有效的请求方法。)
SecRule REQUEST_METHOD "^POST$" phase:1,chain,t:none,id:xxx
SecRule REQUEST_HEADERS:Content-Length "@eq 0" t:none
注意:规则链的作用与AND一致。仅当多条规则中的变量检查同时匹配成功时,才会触发链式规则的第一条规则中指定的阻断性操作。链式规则中无论哪一条规则没有匹配成功,则表示整个规则链匹配失败,即不会执行阻断性动作。
手册上面的第二条语句为
SecRule &REQUEST_HEADERS:Content-Length "@eq 0" t:none
但是在实际应用中添加“&”符号会报错,所以在写规则链的时候需要注意。
- drop
通过发送FIN数据包立即关闭TCP连接。
- deny
停止规则处理并拦截此次访问。
- block
执行SecDefaultAction定义的阻断性动作。
SecDefaultAction phase:2,deny,id:xxx,status:403,log,auditlog #配置阻断后所执行的的默认动作
SecRule ARGS attack1 phase:2,block,id:xxx #检测我们想要阻止的攻击
SecRule ARGS attack2 phase:2,pass,id:xxx #检测我们只想警告的攻击
- msg
将自定义信息分配给规则或规则链。 该消息将与每次警报一起记录到日志中。
SecRule &REQUEST_HEADERS:Host "@eq 0" "log,id:xxxx,severity:2,msg:'无请求主机'"
运算符
- beginsWith
如果在输入的开头找到参数字符串,则返回true。eg:
SecRule REQUEST_LINE "@beginsWith GET" "id:xxx" #检测以“GET”开头的请求行
- contains
如果在输入中的任何位置找到参数字符串,则返回true。eg:
SecRule REQUEST_LINE "@contains .php" "id:xxxx" #在请求行中的任何位置检测是否包含“.php”字符串
- containsWord
如果在输入中的任何位置找到参数字符串(带有字边界),则返回true。
SecRule ARGS "@containsWord select" "id:xxx" #在ARGS的任何地方检测是否包含“select”字符串
- rx
通过提供的正则表达式,对指定的变量进行匹配检测。rx是默认运算符,所有未明确指定运算符的规则都将默认使用@rx作为运算符。
SecRule REQUEST_HEADERS:User-Agent "@rx
评论