打造一款可靠的WAF(Web应用防火墙)

版权声明:本文为EnweiTech原创文章,未经博主允许不得转载。 https://blog.csdn.net/English0523/article/details/78899312

之前写了一篇《WAF防御能力评测及工具》,是站在安全运维人员选型WAF产品的角度来考虑的(优先从测试角度考虑是前职业病,毕竟当过3年游戏测试?!)。本篇文章从WAF产品研发的角度来YY如何实现一款可靠的WAF,灵感来自ModSecurity等,感谢开源。

本片文章包括三个主题

(1) WAF实现 WAF包括哪些组件,这些组件如何交互来实现WAF防御功能 

(2)WAF规则(策略)维护规则(策略)如何维护,包括获取渠道,规则测试方法以及上线效果评测 

(3) WAF支撑WAF产品的完善需要哪些信息库的支撑

一、WAF实现

‍‍WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。不管硬件款,软件款,云款,核心都是这个,而接下来围绕这句话来YY WAF的实现。WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成

1. 配置模块

设置WAF的检测粒度,按需开启,如图所示

设置WAF的检测粒度

2. 协议解析模块(重点)

协议解析的输出就是下一个模块规则检测时的操作对象,解析的粒度直接影响WAF防御效果。对于将‍WAF模块寄生于web 服务器的云WAF模式,一般依赖于web 服务器的解析能力。

协议解析模块

3. 规则模块(重点)

重点来了,这块是WAF的核心,我将这块又细分为三个子模块。

(1) 规则配置模块

IP黑白名单配置、 URL黑白名单配置、以及挑选合适的规则套餐。

规则配置模块

(2)规则解析模块

主要作用是解析具体的规则文件,规则最好采用统一的规则描述语言,便于提供给第三方定制规则,ModSecurity这方面做得非常优秀。

规则文件由四部分组成,分为变量部分、操作符部分,事务函数部分与动作部分。

规则解析模块

规则解析模块

(3)规则检测模块

上一步我们设置了各种变量,接下来就是按照一定的逻辑来做加减乘除了。

规则检测模块

4. 动作模块(重点)

‍通过规则检测模块,我们识别了请求的好恶,接下来就是做出响应,量刑处理,不仅仅是拦截。‍

动作模块

5. 日志模块(重点)

‍日志处理,非常重要,也非常火热,内容丰富到完全可以从WAF独立出来形成单独的安全产品(e.g.日志宝)而采用提供接口的方式来支撑WAF。对于数据量巨大的云WAF,都会有单独的大数据团队来支撑架构这一块,包括数据存储(e.g. hdfs) ,数据传输(kafka),数据离线分析(hadoop/spark),数据实时分析(storm),数据关联分析(elasticsearch)等等,以后另开一篇单独说明。‍

日志模块

6. 错误处理模块

以上模块运行错误时的异常处理

二、WAF规则(策略)维护

‍WAF需要修炼一图以蔽之‍

WAF规则(策略)维护

三、WAF支撑信息库

‍WAF需要修炼一图以蔽之‍

WAF支撑信息库‍‍

以上支撑库几乎所有的安全人员都在重复地做,而资源没有共享的原因,一是内部不可说;二是没有采取统一的描述语言无法汇合,唉,安全从业人员的巴别塔。

四、补充知识(包括文章与代码)

想想写了这么多文章,自我感觉萌萌哒!

WAF相关

WAF防御能力评测及工具

ssdeep检测webshell

ModSecurity相关文章(我就是ModSecurity的死忠粉)

[科普文]ubuntu上安装Apache2+ModSecurity及自定义WAF规则

ModSecurity SecRule cheatsheets

ModSecurity CRS 笔记、WAF防御checklist,及WAF架构的一些想法

ModSecurity 晋级-如何调用lua脚本进行防御快速入门

ModSecurity 白名单设置

指纹识别

Web应用指纹识别

FingerPrint

IP相关

使用免费的本地IP地理库来定位IP地理位置-GeoIP lookup

获得IP的地理位置信IP Geolocation及IP位置可视化

IP地理信息离线获取脚本

IP地理信息在线获取脚本

识别搜索引擎脚本

判断使用哪家CDN脚本

代理类型判断脚本 Proxy探测脚本与HTTP基本认证暴力破解脚本

CDN架构

网站负载均衡技术读书笔记与站长产品的一点想法

正则优化

NFA引擎正则优化TIPS、Perl正则技巧及正则性能评测方法

HTTP发包工具

HTTP.pl——通过HTTP发包工具了解HTTP协议

HTTP发包工具 -HTTPie

WAF实现的思维导图

参考:

ModSecurity  Handbook

‍第八、九、十,十一我是反复看,每次都有新的灵感,第14、15章是当成新华字典看的,以免遗忘。‍

Web Application Defenders Cookbook Battling Hackers and Protecting Users》 ‍(红宝书,还在看)

FreeBuf推荐:碳基体MM微博

http://weibo.com/tanjiti

WAF自动化暴破(绕过)脚本xwaf

                                       _  ___      _____   ____
                                      | |/_/ | /| / / _ | / __/
                                     _.  < | |/ |/ / __ |/ _/  
                                    /_/|_| |__/|__/_/ |_/_/

xwaf

xwaf是一个python写的waf自动绕过工具,上一个版本是bypass_waf,xwaf相比bypass_waf更智能,可无人干预,自动暴破waf

Disclaimer

[!] legal disclaimer: Usage of 3xp10it.py and web.py for attacking targets without prior mutual consent is 
illegal.It is the end user's responsibility to obey all applicable local, state and federal laws.Developers
assume no liability and are not responsible for any misuse or damage caused by this program.

Requirement

python3
pip3
works on linux(test on ubuntu and kali2.0,others not test)

python3安装可参考如下步骤:
    apt-get install python3
    或:
    wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
    tar xJf Python-3.5.2.tar.xz
    cd Python-3.5.2
    ./configure --prefix=/opt/python3
    make && make install
    ln -s /opt/python3/bin/python3.5 /usr/local/bin/python3

pip3安装:
apt-get install -y python3-pip

kali linux2安装pip3可参考如下步骤:
    echo "deb-src http://http.kali.org/kali kali main non-free contrib" >> /etc/apt/sources.list
    echo "deb-src http://security.kali.org/kali-security kali/updates main contrib non-free" >> /etc/apt/sources.list
    apt-get update
    apt-get install python3-pip

Usage

eg:
1.python3 xwaf.py -u "http://www.baidu.com/1.php?id=1"
2.python3 xwaf.py -u "http://www.baidu.com/1.php" --data="postdata" -p xxx
3.python3 xwaf.py -r /tmp/headerfile -p xxx --level 5

Attention

1.xwaf支持除-m/-l外的所有sqlmap参数,用法和sqlmap一样即可,-m/-l为批量功能,暂不支持,如果需要批量,请自行code实现
2.由于xwaf已经有比较好的参数方案,一般情况下尽量少用参数,如果有必须要用的参数除外[如--data/-p/-r等参数]
3.普通get类型注入点,这样用即可:
  python3 xwaf.py -u "http://www.baidu.com/1.php?id=1&page=2" -p id
4.人工输入的参数的优先级大于xwaf自带的参数方案
5.关于--tamper参数的使用:
  xwaf的主要功能是排列组合使用所有可能的tamper组合来爆破waf,如果人为使用了--tamper参数,xwaf将在人为设置的已有
  tamper基础上再排列组合,eg.人为使用的命令为:
  python3 xwaf.py -u "http://www.baidu.com/1.php?id=1" --tamper=space2comment
  那么xwaf使用的tamper方案中的每个都会有space2comment
6.关于代理的使用:
  a)xwaf默认不用代理,如果使用代理需要在xwaf运行后选择y|Y
  b)使用的代理来源于程序自动收集的网上的代理
  c)使用代理有防封的优点,但网络连接速度不一定能保证
7.need python3

代码流程图

以[127.0.0.1/1.php?id=1为例]

1.start
2.检测系统/root/.sqlmap/output/127.0.0.1/log文件是否存在
3.获取log文件:
    如果不存在log文件则调用get_log_file_need_tamper函数,执行完这个函数后获得log文件,也即成功检测出目标
    url有sqli注入漏洞,如果执行完get_log_file_need_tamper函数没有获得log文件则认为该url没有sqli漏洞
4.获取db_type[数据库类型]
    调用get_db_type_need_tamper函数,用于后面的tamper排列组合时,只将目标url对应的数据库类型的tamper用于
    该目标在sql注入时tamper的选择后的组合
5.获取sqli_type[注入方法]
    调用get_good_sqli_type_need_tamper函数,sql注入方法中一共有U|S|E+B|Q|T 6种注入方法,后3种查询效率低,
    首先在log文件中查找是否有U|S|E这3种高效方法中的任意一种,如果有略过这一步,否则执行
    get_good_sqli_type_need_tamper函数,执行该函数将尝试获得一种以上的高效注入方法
6.获取current-db[当前数据库名]
    如果上面获得了高效注入方法,则先用高效注入方法获得current-db,如果没有则用B|Q|T方法尝试获得
    current-db,用来尝试获得current-db的函数是get_db_name_need_tamper
7.获取table[当前数据库的表名]
    如果上面获得了高效注入方法,则先用高效注入方法获得table,如果没有则用B|Q|T方法尝试获得table,尝试获得
    table的函数是get_table_name_need_tamper
8.获取column[当前数据库的第一个表的所有列名]
    如果上面获得了高效注入方法,则先用高效注入方法获得column,如果没有则用B|Q|T方法获得column,尝试获得
    column的函数是get_column_name_need_tamper
9.获取entries[column对应的真实数据]
    调用get_entries_need_tamper函数,执行完get_entries_need_tamper函数后,waf成功绕过,从上面的步骤一直到
    这个步骤,逐步获得最佳绕过waf的脚本组合

About

1.xwaf支持记忆,运行中断后下次继续运行时会在中断时的最后一个命令附近继续跑,不会重新经历上面的所有函数的处理
2.xwaf支持sqlmap除-m/-l外的所有参数用法
3.各个get_xxx_need_tamper函数的处理采用针对当前url的数据库类型(eg.MySQL)的所有过waf的脚本
  (在sqlmap的tamper目录中)的排列组合的结果与--hex或--no-cast选项进行暴力破解如果--hex起作用了则不再使用
  --no-cast尝试,--no-cast起作用了也不再用--hex尝试
4.xwaf运行完后将在/root/.sqlmap/output/127.0.0.1目录下的ini文件中看到相关信息,bypassed_command是成功暴破
  waf的sqlmap语句
5.在tamper组合中,先用到的tamper会加入到上面的ini文件中,在以后的每个tamper组合中,综合已经得到的有用的
  tamper再组合,在上面的ini文件中的tamper_list即为不断完善的tamper组合
6.支持自动更新升级,当前版本为1.1

Changelog

[2017-02-13]
更新支持代替sqlmap跑普通没有waf的注入点,之前版本要求只能跑有waf的注入点

[2017-02-13]
更新支持自动进行版本升级

[2017-02-12] 
更新支持所有sqlmap参数

[2017-01-18]
fix line128处的slef改成self  
fix line128处的db_name未定义错误

[2016-11-15]
修复一处ACCESS数据库考虑不周全判断和几处good_print函数调用错误
增加支持代理自动切换功能,自选,默认不用代理[用代理速度较慢]

[2016-11-02]
增加access数据库特殊性的处理gg

[2016-11-01]
get_db_type_need_tamper之后的数据库类型获取由之前的get_db_type_from_log_file改成
eval(get_key_value_from_config_file(self.log_config_file,'default','db_type'))
附录:WAF攻防实战

摘要

本文主要分为四个部分,一、首先对WAF做了简单的介绍,让读者对WAF这类产品有一个大概的了解;二、这部分通过一个实例演示了如何利用WAF为其后端的Web应用提供安全防护功能;三、安全是相对的,世界上任何一款安全产品都不可能提供100%的安全防护功能,WAF也是一样。因此,第三部分主要讨论了WAF的安全性,介绍了一些主流的WAF绕过技术,并结合真实案例来演示了如何尝试绕过WAF的防护,成功攻击其后端的Web应用;四、这部分对WAF的安全性进行了总结,告诉读者如何用正确、理性的眼光去看待WAF这类产品。

1、WAF介绍

WAF(Web Application Firewall)的中文名称叫做“Web应用防火墙”,利用国际上公认的一种说法,WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。通过从上面对WAF的定义中,我们可以很清晰的了解到,WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。

根据不同的分类方法,WAF可分为许多种。从产品形态上来划分,WAF主要分为以下三大类:

1.1硬件设备类

目前安全市场上,大多数的WAF都属于此类。它们以一个独立的硬件设备的形态存在,支持以多种方式(如透明桥接模式、旁路模式、反向代理等)部署到网络中为后端的Web应用提供安全防护。相对于软件产品类的WAF,这类产品的优点是性能好、功能全面、支持多种模式部署等,但它的价格通常比较贵。国内的绿盟、安恒、启明星辰等厂商生产的WAF都属于此类。

1.2软件产品类

这种类型的WAF采用纯软件的方式实现,特点是安装简单,容易使用,成本低。但它的缺点也是显而易见的,因为它必须安装在Web应用服务器上,除了性能受到限制外,还可能会存在兼容性、安全等问题。这类WAF的代表有ModSecurity、Naxsi、网站安全狗等。

1.3基于云的WAF

随着云计算技术的快速发展,使得其于云的WAF实现成为可能。国内创新工场旗下的安全宝、360的网站宝是这类WAF的典型代表。它的优点是快速部署、零维护、成本低。对于中、小型的企业和个人站长是很有吸引力的。

2、利用WAF为Web应用提供防护

在这里,我们以Naxsi为例来演示下如何利用WAF来为其后端的Web应用提供安全防护。Naxsi是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是帮助人们加固他们的web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。详见http://code.google.com/p/naxsi/wiki/TableOfContents?tm=6

,这里因为篇幅关系就不再详细的介绍了,这里主要演示Naxsi的安装、配置及防护效果。

2.1部署架构:

2.1.1将Nginx配置为反向代理;让访问后端Web服务器的流量都经过Nginx

2.1.2让Nasxi(WAF)检测经过Nginx的流量,将攻击流量根据相关配置进行阻断,从而保护运行在后端Web服务器上的应用程序。

用户正常访问请求处理流程具体如下图所示:

图1

攻击者恶意请求处理流程具体如下图:

图2

2.2 Nginx+Naxsi安装

安装包:

Nginx 1.3.15:http://nginx.org/download/nginx-1.3.15.tar.gz

Naxsi 0.50:http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

pcre-8.32:http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

安装过程:

安装必要的支持组件

在安装Nginx之前,需要先安装必要的支持组件,否则Nginx无法正常安装。

安装pcre过程:

[root@localhost LNMP]# wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

[root@localhost LNMP]#tar -zxvf pcre-8.32.tar.gz

[root@localhost nginx-1.3.15]#cd pcre-8.32

[root@localhost pcre-8.32]]#./configure

[root@localhost pcre-8.32]#make && make install

安装zlib库组件过程:

[root@localhost LNMP]# yum -y install zlib-devel

Nginx和Naxsi安装过程

[root@localhost LNMP]# wget http://nginx.org/download/nginx-1.3.15.tar.gz

[root@localhost LNMP]# wget http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

[root@localhost LNMP]# tar -zxvf nginx-1.3.15.tar.gz

[root@localhost LNMP]# tar -zxvf naxsi-core-0.50.tgz

[root@localhost LNMP]# cd nginx-1.3.15

[root@localhost nginx-1.3.15]# ./configure --add-module=../naxsi-core-0.50/naxsi_src

[root@localhost nginx-1.3.15]#make && make install

启动Nginx,并测试

/usr/local/nginx/sbin/nginx        #启动Nginx

/usr/local/nginx/sbin/nginx -t     #测试配置文件是否正常

Killall -9 nginx                    #杀死nginx进程

kill -HUP `cat /usr/local/www/nginx/logs/nginx.pid`   #以平滑方式重启Nginx

图3

如果在启动Nginx时,出现如下错误:

图4

按照下面的方法即可解决。

32位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64

2.3配置过程:

这个具体配置分为两个过程:一、修改Nginx.conf配置文件,配置与Naxsi(WAF)相关选项;二、将Nginx配置为反向代理,为后端Web服务器提供防护。

2.3.1配置Naxsi相关

首先,将Naxsi的核心配置规则库拷贝一份至Nginx文件所在目录,

图5

接着修改Nginx.conf配置文件,在其中加入如下一行配置,让其包含Naxsi的核心规则库文件:

图6

然后定义一个虚拟主机的安全规则,可参考下面的内容:

LearningMode; #Enables learning mode

SecRulesEnabled;

#SecRulesDisabled;

DeniedUrl "/RequestDenied";

include "/tmp/naxsi_rules.tmp";

## check rules

CheckRule "$SQL >= 8" BLOCK;

CheckRule "$RFI >= 8" BLOCK;

CheckRule "$TRAVERSAL >= 4" BLOCK;

CheckRule "$EVADE >= 4" BLOCK;

CheckRule "$XSS >= 8" BLOCK;

将上面的内容保存在一个文件中。如test.rules。下面会用到。

自定义一个阻断页面,当WAF检测到攻击时,会将该页面返回给用户,可参考如下内容:

<html>

<head>

<title>Error 403 Request Denied</title>

</head>

<body>

<h2>Error 403 Request Denied</h2>

For some reasons, your request has been denied.

</body>

</html>

2.3.2配置反向代理

新建一个虚拟主机的配置文件,具体配置如下图所示:

图7

最后,再次修改Nginx.conf,使其包含刚定义的虚拟主机配置文件即可。

图8

重启Nginx服务后配置生效。

2.4防护效果演示

未使用WAF时,不具备攻击防护能力。

图9

图10

图11

使用WAF后,恶意攻击被阻断。

图12

图13

图14

3、WAF安全介绍

WAF作为一种安全产品为Web应用提供安全防护,可以增大攻击者的攻击难度和攻击成本,这一点是不容至疑的。但是,WAF并不是万能的,世界上没有任何一款安全产品可以提供100%的安全防护。由于产品的设计或实现原理,及其他问题都有可能导致攻击者可以成功绕过WAF的防护,来达到攻击后端Web应用的目的。除了WAF自身的安全性以外,现在讨论最多的就是WAF的绕过技术。在介绍WAF绕过技术之前,我们必须要要搞明白一个问题,那就是WAF为什么会存在被绕过的风险?这是因为WAF对数据包的解析和Web服务器对数据包的解析两者之间存在差异,所以存在被绕过的可能。下面列出了一些在SQL注入过程中主流的WAF绕过技术:

1.转换特征字符大小写

2.利用注释绕过

3.编码特征字符绕过

4.分隔重写特征字符绕过

5.利用截断字符绕过

6.变换变量位置绕过

7.针对域名保护的绕近

8.超大数据包绕过

9.转换数据提交方式绕过

10.HPP(HTTP参数污染)绕过

上面列出的这些WAF绕过技术网上都有相应的详细介绍,这里因为篇幅关系就不再介绍了,感兴趣的读者可以自行百度查找相关资料。下面我们通过一个真实案例来介绍下WAF的绕过。

WAF绕过技术实例

在前段时间安全宝举办的一个WAF绕过活动中,白帽子们通过各种技巧成功绕过了安全宝的WAF。下面以一个我发现的WAF绕过技巧来进行说明:

背景介绍:

在一个存在SQL注入漏洞的Web应用前面部署了安全宝的云WAF,访问Web应用的流量首先要经过WAF,由WAF检测是否存在攻击行为,如果WAF检测到恶意攻击行为,将向攻击者返回特定的阻断页面。否则,将返回正常的页面。

1.先通过经典的“and 1=1”去判断该Web应用是否存在SQL注入漏洞。因为前端有WAF的防护,正常情况该请求应该会被WAF拦截。同预想的结果一样,当我们发送有攻击特征的请求时,会WAF阻断,返回了一个405的错误页面。

图15

2.现在我们尝试将GET请求转换为POST,在POST的请求中带上攻击字符串,来判断是否是被WAF拦截。结果如何呢?请看下图:

图16

3.通过上图我们可以看到该请求并没有被WAF拦截,而是返回了Web应用的正常页面。说明我们成功绕过了WAF。但是,到此为至,我们仅仅是确认了该Web应用存在SQL注入漏洞。那么下面我们来尝试构造SQL语句来提取该Web应用数据库的相关信息。结果如下图:

图17

4.通过上面的测试,我们可以确认,将GET请求转换为POST后,可以成功绕过WAF的检测,从而成功获取到目标Web应用的相关信息和数据。其他的WAF也可能会存在同样的问题。

4、总结

通过上面的介绍和相应的实例演示,相信读者对WAF都有了一个比较全面的认识。那么我们应该如何看待WAF这类产品呢?有两种极端的认识都是错误的,1、部署WAF后,就可以高枕无忧,不用再担心安全问题了;2.WAF没有用,理由是可能会被绕过。

为什么说这两种认识都是错误的呢?首先对于第一点,WAF作为一种安全产品,防护的是通用型的攻击,通常担任一个虚拟补丁的角色。还有各个厂家的WAF因为实现原理、技术能力、型号等其他方面的原因在性能、防护能力上也并不相同,不可一概而论。WAF可以防御大部分的常规攻击,阻挡很大一部分的攻击者,这一点不可否认,否则WAF也就没有存在的价值了。但对于一些技术能力较强的攻击者,WAF并不能阻挡住他们攻击的脚步,他们有能力绕过WAF来成功实施攻击。对于第二点,其实我们前面已经说过了,安全是相对的,世界上没有哪款安全产品可以提供100%的安全防护。所以,我对于WAF的态度是,没有必要神化WAF,它并不像厂商说的那样神奇,但也不用过分看淡WAF,毕竟WAF可以阻挡大部分的常规攻击,可以极大提高Web应用的安全性,是一种Web应用防护的有效手段。


没有更多推荐了,返回首页