背景
最近需要测试关于waf的工具,要知道waf是怎么回事,必须搭建waf环境,同时才能看懂关于绕过waf的一些技术。
OWASP ModSecurity核心规则集(CRS)是一组用于ModSecurity或兼容的Web应用程序防火墙的通用攻击检测规则。CRS旨在保护Web应用程序免受各种攻击,包括OWASP十大攻击,并提供最少的虚假警报。
项目地址:https://github.com/SpiderLabs/owasp-modsecurity-crs
因为经常使用kali,因此环境全是在kali上面搭建,也不会再重新下载别的系统。
版本
~# cat /proc/version
Linux version 4.19.0-kali3-amd64 (devel@kali.org) (gcc version 8.2.0 (Debian 8.2.0-16)) #1 SMP Debian 4.19.20-1kali1 (2019-02-14)
安装modsecurity
apt-get install modsecurity-crs
它会自动加载相关组件
配置modsecurity
修改/etc/modsecurity/下的modsecurity.conf
mv /etc/modsecurity/modsecurity.conf-recommended modsecurity.conf
将文件中
SecRuleEngine DetectionOnly修改为SecRuleEngine On
测试SQL注入
在上面的配置启用之前也就是默认是仅检测(DetectionOnly),我们先来看看效果
使用DVWA中sql注入测试即可,可看到存在sql注入
启用安全规则引擎SecRuleEngine (SecRuleEngine On)之后,需重启apache2
显示403 Forbidden错误,可见waf已经生效。
工作原理
我们回过头分析下它的一个配置
1.首先我们安装了modsecurity-crs,它会自动安装apache2的库
跟进这个文件,我们看到它包含了刚才我们配置的文件,并且和它自己的安装目录
跟进安装目录,又包含了owasp-crs.load这个文件
继续跟进这个owasp-crs.load文件,它包含了自己目录下rules下的所有文件
规则文件
由此可以看出: 规则文件一共有如下几类
1. request 请求
2. response 响应
3.错误 有iis的 java的php的
4.扫描类 sannner
5.unix-shell类,也就是木马类
我们重新梳理下刚才的逻辑,也就是调用过程:
首选我们发了一个sql注入的请求给apache2 ,apach2发现库中又引用security2.conf这个配置,于是调用所有与mod-security相关的规则集。最后经过一些列处理,返回了403错误,这个mod-security就这样被调用起来了。
规则分析
我们打开apache2的日志目录,在/var/log/apach2下
发现存在一个mod-security的日志,这个就是waf审计的日志,它记录了了所有攻击日志
我们发起一个sql注入探测攻击之后,本应该返回给我们一个You have an error in your SQL syntax; check the manual tha…….等等的sql查询错误的,为什么返回给我们一个403呢
我们跟进下面的Pattern match,意思就是,它匹配到了如下规则目录中的一些信息
我们可以看到好多Pattern match,打开其中一个response的规则
根据显示第373行,我们打开该规则文件中的373行
可见,正是匹配到了该响应,它是由多个分隔符形成的,也就是它匹配到了规则其中的一个分隔符中的数据,所以才认为这是一个攻击行为。
看了几个规则文件和命名之后,至此,我们大概知道了它的一个检测过程,至少分为以下3步
1.它首先会去检测请求头Request-Headers
2.它会去检测请求Request
3.检测响应response
如果以上三步都没有问题,那么会认为这是一个正常访问,而非攻击,只要其中有一个匹配上,那么它将会返回403错误。