开源WAF(mod_security)的搭建和分析

背景

最近需要测试关于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错误。至于这个条件是什么以后再去查找相关资料深入研究。