一、WAF的概念
WAF( Web Application Firewall ),即Web应用防火墙
- 通过执行一系列HTTP/HTTPS(应用层的协议)的安全策略为Web应用提供保护的一种网络安全产品。
- 增加攻击者的难度和成本,但不是100%安全。
- 工作在应用层。
WAF的优势
二、WAF的功能
- SQL Injection (SQLi):阻止SQL注入
- Cross Site Scripting (XSS):阻止跨站脚本攻击
- Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击
- Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击
- Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击
- PHP Code Injectiod:阻止PHP代码注入
- Metadata/Error Leakages:阻止源代码/错误信息泄露
- HTTP Protocol Violations:阻止违反HTTP协议的恶意访问
- HTTPoxy:阻止利用远程代理感染漏洞进行攻击
- Shellshock:阻止利用Shellshock漏洞进行攻击
- Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击
- Scanner Detection:阻止黑客扫描网站
- Project Honey Pot Blacklist:蜜罐项目黑名单
- GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断
三、WAF的分类
1.硬件设备类
以硬件的形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,在旁路监听时只记录攻击,不拦截。独立部署。
绿盟、安恒、铱迅、天融信、深信服、启明星辰、知道创宇、F5 BIG-IP
部署位置
2.软件产品类
以软件的形式安装在服务器上,可以直接检测服务器是否存在webshell,是否有文件被创建等。 一般与服务器部署在一起。(缺点是占用服务器的资源,优点是便宜适合小公司)
D盾,云锁,网防G01,安全狗,护卫神,智创,悬镜,UPUPW,安骑士。
不同waf的拦截页面
https://zhuanlan.zhihu.com/p/335602174?utm_id=0
3.基于云的WAF
通过配置NS或CNAME记录,使得对网站的请求报文优先经过WAF主机,经过WAF主机过滤后,将被认为无害的请求报文再发送给实际网站服务器进行请求,可以认为是自带防护功能的CDN。
安全宝、创宇盾、玄武盾、腾讯云(T-Sec Web 应用防火墙)、百度云(应用防火墙 WAF)、西部数码、阿里云盾、奇安信网站卫士。
优势:价格低廉,不用部署
云WAF示意图:
https://www.tmooc.cn→DNS服务器,根据域名查询得到Web服务器的IP地址。浏览器连接并访问Web服务器。
https://www.tmooc.cn→DNS服务器,根据域名查询得到WAF的IP地址。浏览器将请求发送给WAF,经过WAF检查和过滤后,请求才会到Web服务器。响应也是一样,数据通过WAF响应回浏览器。
云waf解析流程: 部署了云waf的网站,DNS服务器解析的时候解析的是云waf的地址,这样就会经过云waf再到web服务器。
所以现在很多的web服务器怕被绕过,就禁止IP访问,一定要通过域名访问,
四、ModSecurity
1 ModSecurity的概念
- ModSecurity是一个开源的、跨平台的Web应用防火墙(WAF),被称为WAF界的“瑞士军刀”。软件产品。
- 它可以通过检查Web服务接收到的数据,以及发送出去的数据来对网站进行安全防护。
- 中文社区:http://www.modsecurity.cn/
选它来测试,以下原因,江湖地位、免费、开源、跨平台,很多同类产品都参考了它的设计
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(可自行搭建个Ubuntu 16完成前三个步骤,或需要我这个虚拟机的可以私聊我给你发)
服务器:Apache2
首先,解压Ubuntu 16,VM打开(跳出弹框就获取所有权),
打开快照管理后会看到有很多快照,接下来我从第三个快照开始从新搭建一遍
从已安装apt更新源快照开始操作,点击第三个快照,转到,我已移动该虚拟机,
1.更新apt源(因为我这个普通用户,$符,所以命令前我都加sudo)
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环境安装完成,以下是配置ModSecurity和apache。(还要经过一系列设置让它启动起来)
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文件,开始规则引擎
第七行原本的意思是仅仅检测不起作用
显示行号的技巧:set nu
sudo vi modsecurity.conf
…
SecRuleEngine On
…
文件的第七行,修改为On
9.在apache中启用modsecurity模块
也就是说他两是一种有数据的交互所以呢在apache的目录下边有一个是专门针对modsecurity的,也可以认为modsecurity目前是apache的一个安全模块。所以修改它增加相应的设置。
9.1 打开security2.conf 文件
sudo vi /etc/apache2/mods-available/security2.conf
9.2在<IfModule></IfModule>中加入以下内容,保存退出
include /usr/share/modsecurity-crs/*.conf
include /usr/share/modsecurity-crs/activated_rules/*.conf
作用:include文件包含,activated_rules活动规则,*.conf规则文件,写的规则文件都得在这个/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写入以下内容,保存退出(意思是不允许物理机192.168.10.1访问,编号为1,阶段一,日志,日志审计,拒绝,状态码返回浏览器403)
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可以通过
14.查看日志
sudo less /var/log/apache2/modsec_audit.log
q 退出
注意的问题:
有时我们设置了黑名单,也重启了apache服务,但是处于黑名单IP的浏览器仍然可以访问到页面。原因是浏览器有缓存,要想看到结果,我们清除一下浏览器的缓存。
自行测试:修改规则,允许真机访问,不允许kali和Ubuntu本机访问!
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.需要时,清除浏览器缓存,再访问 **
有时间可以完成以上练习,初步感受modsecurity(WAF)的作用.
仅仅封IP地址那跟普通防火墙差不多,还不能够体现waf的优势,接下来继续
6.Ubuntu搭建测试DVWA靶机
1.下载DVWA源码文件,并解压
1.1 切换目录
cd /var/www/html/
1.2 下载DVWA源码文件
sudo wget https://github.com/ethicalhack3r/DVWA/archive/master.zip
如果下载失败,多尝试几次就可以了(因为访问github慢,但这个源码小,有几率成功的),再不行就复制进去或者上魔法
靶场下载地址:蓝奏云
https://wwtt.lanzn.com/b00uyckd9a
密码:2x71
注意在/var/www/html下 .表示当前文件夹
sudo cp /home/tedu/DVWA-master.zip .
1.3 解压缩
sudo unzip DVWA-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(三秒内没报错那就OK)
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(这种比用root账号安全的多)
作用:授权all(增删改查)权限针对于dvwa这个库的所有表,并且dvwa一定是本地连接,
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/
因为属主和属组都是root不太好
改之后,网站的属主和属组就应该是它本身,防权止别人使用sudo提
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 ,进入主界面,然后点击下面的部署表就行,自动跳回登录界面再继续登录就可
注意:在windows和Ubuntu中部署DVWA有一定区别的。
简单区分不同操作系统的方法
注意,在Windows里边无论你的目录大小写它是不区分的,LINUX系统里边如果目录是大写那就一定是大写,这也是最简单区分不同操作系统的方法,看网站受不受影响。
二、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
展示出来的是刚刚写的封IP的规则,删掉不需要了,换下面的(按两次DD键就全快速删除了)
1.3 写入以下内容
SecRule ARGS "@contains <script>" "id:2,deny,status:403"
解释:SecRule(创建规则) ARGS(规则作用于参数包括get、post) "@contains <script>" "id:2,deny(禁止),status(状态码):403"
1.4重启apache2服务
sudo systemctl restart apache2
之后在物理机测试一下,输入<script>alert(1);</script>,然后就是被禁止了。说明被waf防护了,没有调用后端代码,
1.5 防止大小写绕过
但是,<Script>alert(1);</Script>,某一个字母改成大写呢?就可以绕过WAF了,所以规则也是有漏洞的,没有做太严格的限制,可以改下成下面
SecRule ARGS "@contains <script>" "id:2,deny,status:403,t:lowercase"
过程解析:
- ?name=<Script>alert(1)</Script>
- WAF收到name这个参数,将其值转换为小写<script>alert(1)</script>
- 然后执行运算符,<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"
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拦截后,拦截后跳转到自定义拦截页面
因为拦截的页面后自定义的是默认带有信息泄露,得换一个页面,这个是modsec提供的,f复制进去
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这个组织写好了现成的规则,可以直接用
四、OWASP规则集的部署
1.下载规则集(下载不成功,就复制)
tedu@ubuntu: ~$ sudo wget https://github.com/root25/MODSEC/raw/master/modsecurity-crs_2.2.5.tar.gz
蓝奏云下载地址:https://wwtt.lanzn.com/b00uydem8d
密码:8jlx
2.规则集介绍
ModSecurity OWASP 规则集说明_modsecurity 集成owasp规则-CSDN博客
自己写的就很简单的,看下图对比别人写好的(显得自己写的很小儿科),经过多次测试的,直接套用别人完善的最能起到防御的作用
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的防御
用了别人的那自己的删掉就好了,我们自己写是很难写出来的,写不出这么完善,这个是针对XSS的严密的防护,接下来继续
**作业1:**将基础规则集全部部署,看行不行。
修改modsecurity_crs_21_protocol_anomalies.conf,将该文件中,id为960017的规则注释或删除就可以了
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。
如果考虑使用Sqlmap绕WAF,通过tamper脚本。sqlmap有自带的tamper脚本,我们也可以从网上搜索更多的tamper脚本。
sqlmap 使用tamper脚本绕过WAF
适用于测试学习,还有,假如公司不想掏钱又想价格低廉的,来一个waf,可以用上,
做渗透的时候遇到哪个waf就去查如何绕那个waf