39_WAF的概念、功能,ModSecurity部署配置、LAMP环境部署、Ubuntu搭建DVWA靶机测试、测试WAF防御、OWASP规则集的部署

一、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"

过程解析:

  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"

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

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值