一、WAF的概念

WAF( Web Application Firewall ),即Web应用防火墙

WAF的优势

二、WAF的功能

三、WAF的分类

1.硬件设备类

以硬件的形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,在旁路监听时只记录攻击,不拦截。独立部署。
绿盟安恒铱迅天融信深信服启明星辰知道创宇F5 BIG-IP
部署位置

2.软件产品类

以软件的形式安装在服务器上,可以直接检测服务器是否存在webshell,是否有文件被创建等。 一般与服务器部署在一起。
D云锁网防G01安全狗护卫神智创悬镜UPUPW安骑士
不同waf的拦截页面
https://zhuanlan.zhihu.com/p/335602174?utm_id=0

3.基于云的WAF

通过配置NSCNAME记录,使得对网站的请求报文优先经过WAF主机,经过WAF主机过滤后,将被认为无害的请求报文再发送给实际网站服务器进行请求,可以认为是自带防护功能的CDN。
安全宝、创宇盾、玄武盾、腾讯云(T-Sec Web 应用防火墙)、百度云(应用防火墙 WAF)、西部数码、阿里云盾、奇安信网站卫士。
WAF示意图:
https://www.tmooc.cn→DNS服务器,根据域名查询得到Web服务器的IP地址。浏览器连接并访问Web服务器。
https://www.tmooc.cn→DNS服务器,根据域名查询得到WAFIP地址。浏览器将请求发送给WAF,经过WAF检查和过滤后,请求才会到Web服务器。响应也是一样,数据通过WAF响应回浏览器。





四、ModSecurity

1 ModSecurity的概念

2 ModSecurity的工作过程

•解析HTTP请求内容
•将解析后的内容与规则匹配
•根据规则进行处理
•日志记录

modsecurity的详细工作过程:

3 ModSecurity规则

ModSecurity规则结构

SecRule VARIABLES OPERATOR [ACTIONS]
SecRule:ModSecurity主要的指令,用于创建安全规则
VARIABLES:变量,规定了安全规则针对的对象(上哪找?)
OPERATOR:操作符,定义安全规则的匹配条件(怎么找?)
ACTIONS:响应动作,定义数据包被规则命中后的响应动作(做什么?)
常见变量VARIABLES对象
ARGS:所有请求参数
FILES:所有文件名称
REQUEST_HEADERS:请求数据头部
常见操作符OPERATOR条件
@rx:正则表达式
@streq:字符串相同
@ipmatch:IP相同
@contains:包含字符串
常见响应动作ACTIONS处理
deny:停止规则处理并拦截此次访问
pass:规则匹配成功后,仍继续使用下一个规则进行处理(通过
id:定义规则编号( id必须进行配置,且必须是数字)
severity:定义事件严重程度
phase:配置规则的处理阶段 (1~5)
t:调用转换函数
block:用于阻止访问,但不指定阻止的具体执行方式
常见转换函数
lowercase:所有字符转换为小写
removeNulls:从输入数据中删除所有空字节
removeWhitespace:从输入数据中删除所有空白字符
trim:删除输入字符串左侧与右侧的所有空格

4. ModSecurity规则示例

•防XSS攻击
SecRule ARGS|REQUEST_HEADERS "@rx<script>" "id:001,msg:'XSS Attack',severity:ERROR, deny, status:404"


5.ModSecurity部署配置

•部署环境
OS平台:Ubuntu 16
服务器:Apache2
从已安装apt更新源快照开始操作

1.更新apt
sudo  apt-get  update

2.安装apache2
sudo  apt-get  -y  install  apache2  apache2-dev

3.遇到错误

使用sudo时报错:
E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决:
sudo rm /var/lib/dpkg/lock-frontend

如果还出来错,删除那个文件即可,比如:
E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
解决:
sudo rm /var/lib/dpkg/lock
然后就可以使用了

4.安装modsecurity

sudo  apt-get  -y  install  libxml2  libxml2-dev  libxml2-utils  libaprutil1  libaprutil1-dev   libapache2-modsecurity

5.安装mysql-5.7

sudo  apt-get  -y  install  mysql-server  mysql-client  libmysqlclient-dev
需要在mysql的安装界面中输入密码 root 和确认密码root。

6.安装PHP7

sudo  apt-get  -y  install  php7-*

7.查看ModSecurity版本号

sudo  dpkg  -s  libapache2-modsecurity  |  grep  Version

LAMP环境安装完成,以下是配置ModSecurityapache。

8.开启ModSecurity功能

8.1 切换到modsecurity目录
cd  /etc/modsecurity/ 

8.2 重命名 modsecurity.conf-recommended 文件名为 modsecurity.conf

sudo  mv  modsecurity.conf-recommended  modsecurity.conf 

8.3 编辑modsecurity.conf文件,开始规则引擎
sudo  vi  modsecurity.conf
SecRuleEngine On
文件的第七行,修改为On

9.在apache中启用modsecurity模块

9.1 打开security2.conf 文件
sudo  vi  /etc/apache2/mods-available/security2.conf
9.2在<IfModule></IfModule>中加入以下内容,保存退出
IncludeOptional /etc/modsecurity/*.conf
 include /usr/share/modsecurity-crs/*.conf
include /usr/share/modsecurity-crs/activated_rules/*.conf

下面我们开始编写规则文件。

10.新建文件my_rule.conf进行测试,拒绝本机访问web

10.1 新建文件my_rule.conf
sudo  vi  /usr/share/modsecurity-crs/activated_rules/ my_rule.conf
10.2写入以下内容,保存退出
SecRule REMOTE_ADDR "@ipMatch 192.168.10.1" "id:1,phase:1,log,auditlog, deny ,status:403"

11.重启apache使配置生效

sudo  systemctl restart  apache2 

12.本机访问测试

可以访问

13.通过真机访问

真机ping可以通过,然后地址栏输入:192.168.10.128 ,发现是可以的。

14.查看日志

sudo less /var/log/apache2/modsec_audit.log
q 退出
注意的问题:
有时我们设置了黑名单,也重启了apache服务,但是处于黑名单IP的浏览器仍然可以访问到页面。原因是浏览器有缓存,要想看到结果,我们清除一下浏览器的缓存。

作业:修改规则,允许真机访问,不允许kaliUbuntu本机访问!
SecRule REMOTE_ADDR "@ipMatch 192.168.10.132,192.168.10.129,127.0.0.1" "id:1,phase:1,log,auditlog,deny,status:403"
1.修改规则
2.重启apache服务
3.需要时,清除浏览器缓存,再访问



6.Ubuntu搭建测试靶机

1.下载DVWA源码文件,并解压

1.1 切换目录
cd  /var/www/html/ 

1.2 下载DVWA源码文件
sudo  wget  https://github.com/ethicalhack3r/DVWA/archive/master.zip 
如果下载失败,多尝试几次就可以了
1.3 解压缩
sudo  unzip  master.zip 
1.4 对目录重命名
sudo  mv  DVWA-master/  DVWA

2.重命名配置文件

2.1切换到config目录
cd  /var/www/html/DVWA/config 
2.2 重命名配置文件(复制了一个新的配置文件)
sudo  cp  config.inc.php.dist  config.inc.php

3.修改php配置文件,支持远程文件包含


3.1 编辑php配置文件
sudo  vi  /etc/php/7.0/apache2/php.ini
3.2 允许远程文件包含
输入 :/allow_url_include,回车,定位到当前行,将值设置为设置为On
allow_url_include = On
输入:wq 保存退出

4.重启apache

sudo  systemctl  restart  apache2


5.创建数据库及管理用户

5.1进入mysql 这条命令不要复制,要自己输入
sudo mysql -uroot -proot  
5.2 创建dvwa数据库
mysql>  create database dvwa ;    
5.3 创建dvwa用户用来管理dvwa库,密码为dvwa@123
mysql>  grant all on dvwa.* to  'dvwa'@' localhost '  identified by 'dvwa@123' ;
5.4 退出mysql
mysql>  exit ;

6.修改DVWA配置文件

6.1 打开配置文件
sudo  vi  /var/www/html/DVWA/config/config.inc.php
6.2 修改的内容如下:
$_DVWA[ ‘db_database’ ] = ‘dvwa’; //数据库名
$_DVWA[ ‘db_user’ ] = ‘dvwa’; //用户名
$_DVWA[ ‘db_password’ ] = ‘dvwa@123’; //密码
$_DVWA[ 'recaptcha_public_key' ] = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb’; //填充key
$_DVWA[ 'recaptcha_private_key' ] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K’;
$_DVWA[ 'default_security_level' ] = 'low';

7.赋予相应的文件权限

直接将DVWA网站源文件的属主和属组修改为www-data即可
sudo  chown  www-data:www-data  -R  /var/www/html/DVWA/

8.重启服务

 sudo  systemctl  restart  apache2  mysql





9.进入dwva界面配置

9.1 浏览器地址栏输入:
http://192.168.10.132/DVWA/setup.php
9.2 在页面中
点击“Create/Reset Database”按钮,安装成功后,页面底部有一个login链接
10.登录
用户名:admin 密码:password ,进入主界面

注意:在windowsUbuntu中部署DVWA有一定区别的。



二、ModSecurity案例

1.XSS防御 ,例如 不允许参数中出现<script>

1.1 dvwa设置安全级别为low,选择“XSS(Reflected)”
然后输入<script>alert(1);</script>,弹框
1.2 打开 my_rule.conf
 sudo  vi  /usr/share/modsecurity-crs/activated_rules/my_rule.conf
1.3 写入以下内容
SecRule ARGS "@contains <script>" "id:2,deny,status:403"
1.4重启apache2服务
 sudo  systemctl restart  apache2 

1.5 防止大小写绕过
SecRule ARGS "@contains <script>" "id:2,deny,status:403,t:lowercase"
过程解析:
  1. ?name=<Script>alert(1)</Script>
  2. WAF收到name这个参数,将其值转换为小写<script>alert(1)</script>
  3. 然后执行运算符,<script>alert(1)</script>包含<script>吗?规则命中,执行deny。

1.6重启apache2服务
sudo  systemctl restart  apache2  



2.文件上传漏洞的防御

1.1 dvwa设置安全级别为low,选择“File Upload”
选择一个php文件,并上传,上传成功
1.2 打开 my_rule.conf
tedu@ubuntu: ~$ sudo vi /usr/share/modsecurity-crs/activated_rules/my_rule.conf
1.3 写入以下内容
SecRule FILES "(?:\.php|\.jsp|\.asp|\.aspx)$" "phase:2,block,log,id:3,t:lowercase"
1.4重启apache2服务
tedu@ubuntu: ~$ sudo systemctl restart apache2

.php: php语言开发的web应用
.jsp: java语言开发的web应用
.asp/.aspx: 微软的c#语言开发的应用



3.xss拦截后,拦截后跳转到自定义拦截页面


SecRule ARGS "@contains <script>" "id:2,deny,status:403,t:lowercase,redirect:http://www.modsecurity.cn/practice/intercept.html"

4.所有拦截后跳转到自定义拦截页面(block)

4.1使用SecDefaultAction,需要写在其他规则之前才能生效
SecDefaultAction " phase:2 ,log,auditlog,deny,status:302,redirect:http://www.modsecurity.cn/practice/intercept.html"
没有写phase:2 这一项,apache启动会失败。
4.2 需要将拦截动作改成“block”,只有使用了“block”的拦截动作,才会执行SecDefaultAction定义的阻断性动作
SecRule ARGS "@contains <script>" "phase:1,id:1,block,t:lowercase"
4.3 文件上传本来写的就是block,不用修改。
最后的配置文件内容:
SecDefaultAction "phase:2,log,auditlog,deny,status:302,redirect:http://www.modsecurity.cn/practice/intercept.html"
SecRule ARGS "@contains <script>"  "id:1, block ,t:lowercase"
SecRule FILES "(?:\.php|\.asp|\.aspx)$" "id:2, block ,t:lowercase"


三、ModSecurity开启日志审计

1.编辑配置文件
sudo vi /etc/modsecurity/modsecurity.conf
tedu@tedu:~$
2.修改内容
SecAuditEngine On #183
SecAuditLog /var/log/apache2/modsec_audit.log #193
3.查看日志内容
sudo cat  /var/log/apache2/modsec_audit.log


四、OWASP规则集的部署


1.下载规则集(下载不成功,就复制)
tedu@ubuntu: ~$ sudo wget https://github.com/root25/MODSEC/raw/master/modsecurity-crs_2.2.5.tar.gz
如果下载失败,
modsecurity-crs_2.2.5.tar.gz

2.规则集介绍
https://blog.csdn.net/Zhao_S/article/details/51755016
3.使用下载的规则集
# 1.切换到活动规则目录
cd /usr/share/modsecurity-crs/ activated_rules 
# 2.选择一条规则文件复制到该目录下
sudo cp /home/tedu/modsecurity-crs_2.2.5/base_rules/modsecurity_crs_41_xss_attacks.conf .

sudo cp /home/tedu/modsecurity-crs_2.2.5/base_rules/*41* .
sudo cp /home/tedu/modsecurity-crs_2.2.5/base_rules/*40* .

   

# 3.重启apache
sudo  systemctl restart  apache2   
#4.验证对XSS的防御 

作业1:将基础规则集全部部署,看行不行。
修改modsecurity_crs_21_protocol_anomalies.conf,将该文件中,id960017的规则注释或删除就可以了
SecRule REQUEST_HEADERS:Host "+$" "phase:2,rev:'2.2.5',t:none,block,msg:'Host header is a numeric IP address', severity:'2',id:'960017',tag:'PROTOCOL_VIOLATION/IP_HOST',tag:'WASCTC/WASC-21',tag:'OWASP_TOP_10/A7',tag:'PCI/6.5.10',tag:'http://technet.microsoft.com/en-us/magazine/2005.01.hackerbasher.aspx',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},setvar:tx.policy_score=+%{tx.notice_anomaly_score},setvar:tx.%{rule.id}-POLICY/IP_HOST-%{matched_var_name}=%{matched_var}"

作业2:什么是XFF?什么是参数污染?
作业3:可以在ubuntu1604部署joomla,然后尝试针对joomla的规则
不同的WAF,网上有着不同的绕过机制。我们需要多尝试!例如:可以绕一下安全狗、D盾、WTS、ModSecurity。
如果考虑使用SqlmapWAF,通过tamper脚本。sqlmap有自带的tamper脚本,我们也可以从网上搜索更多的tamper脚本。
https://www.douban.com/note/798582925/?_i=2006916ug1OQSn