SQL注入之WAF绕过注入

绕过WAF:

 

 

WAF防御原理:
简单来说waf就是解析http请求,检测http请求中的参数是否存在恶意的攻击行为,如果请求中的参数和waf中的规则库所匹配,那么waf则判断此条请求为攻击行为并进行阻断,反之则放行。
常见的sql注入绕过WAF了两种方法:
一种是利用waf可能存在的http协议解析缺陷来绕过waf,另外一种是利用各种方式来包装sql注入语句进行混淆来绕过waf的规则库。
数据:
1.加密解密:吧这个字符串进行加密来写。
 
2.编码解码:base64,md5编码解码
 
3.等价函数:例如mid,ascii这种,用其他的函数来取代这个函数
 
4.特殊符号:我们加进去一些特殊符号,数据库不会产生其他影响,举个例子我们要查一个当前用的是什么数据库,那我们select database();就可以了,我们也可以在database的前面添加一些特殊符号,比如~,!什么的都可以。
WAF是这样的,我们可以理解为是编程语言中的正则表达式,然后他将一些关键新的东西和他的字典进行匹配,如果匹配后发现,那么他就进行拦截,就比如说出现了一些关键字符我们就拦截他,没有就放过。

 

 

看这个图,我们在原本是要查询的是我们现在用的是什么数据库,语句是真确的,WAF也找到的匹配的结果,就输出我们想要的结果,但是我们在database的前面加上了一个~就出现了下面这个结果,所以我们如果输出的语句中有特殊符号就会达到绕过的这种结果,比如说上面的这个写法,~database,他就达到了绕过的结果。
绕过的前提是你这个sql语句要是一个正确是语句。
5.注释符混用:用的好可以实现和特殊符号一样的效果:MySQL的注释符:--+,#等等。
6.参数污染:

 

 

 

 

 

我们随便写一个php,GET形式的代码吧
<?php
$x=$_GET['y'];
echo $x;
?>
这个代码,假设我们给他传了两个数,y=1&y=2
这个时候,我们如果用的是第一个服务端处理方式的话,则会输出最后一个参数
绕过学习:

 

 

我们发现我们在爆数据库的时候,呗WAF拦截了(我们用的POST),在绕过中,有两种方式可以进行绕过,一种是更改方式,二是变异。
我们先将database()拆开试试,我们先输入一个database,我们发现他不会拦截,我们在单输入一个括号(这个写法肯定是错的,所以才不会拦截),也不会拦截。我们通过上面这个例子,我们可以发现,拦截的不是我们的database也不是我们的(),拦截的是我们database()这个整体。所以我们的思路应该是我们要让database和()拆分,但是我们不能让他影响数据库的运行,如果我们实现这个的话,我们也就可以实现绕过了。
方法:
1.我们可以实行注释符来注入:为了证明上面的这个思路,我们可以先这样,我们在database的后面加上一个其他的字母:
我们发现没有拦截,也就是说,上面的这个思路是正确的,接下来我们在试试用过滤符号,我们发现可以执行:
现在我们加一点难度:我们将提交方式改为GET,看看要怎么注入:

 

因为安全狗的POST保护很少,大部分都是GET保护,所以我们将他改为GET相当于提高了难度:
安全狗会自动将这些语句都给拦截掉。
我们在用一次刚刚的语句,发现也给拦截了。
我们去掉了union发现他不会拦截了,我们在去掉select,发现他也不会拦截,但是,只要这两个东西在一起使用的话,就会拦截,因为union select就是安全狗中的拦截掉的联合查询。
所以我们的绕过思路就是,不让这两个在一起,并且可以执行这个sql语句。
我们可以先按照刚刚POST的思路试试能不能成功注入,比如说我们在union和select中都加上注释符,uni/**/on /**/select 变成这样,但是这样变是错误的,我们可以把这句话放到我们的mysql中执行一下看看:
我们用这个方法发现是可以的,但是也被拦截了。
我们在换一种方法,这个方法是这样的:
(补充0A%是一个换行符号。
 23%是#的意思)
我们用%23将union后面的语句过滤掉这样安全狗就检查不出后面的select,但是,问了以防万一,我们用仍以一个字母去干扰一下安全狗,然后我们在换行,再写select 1,2,3#
所以这个语句整体的写下来是这样的
正常写法:
union select 1,2,3#
猜想一:a是用于迷惑安全狗的,以防万一
union #a
->select 1,2,3#
我们换行是为了防止安全狗继续匹配,所以我们将数据写到下一行。
猜想二:#后面会被过滤掉
如果我不换行的话,这个语句就是这样写的:
union #aselect 1,2,3#
这样写的话,#号后面的全部都会被省略掉,相当于就执行了一个union
第二种思路:
补充:mysql的过滤方法有/***/,这个也是过滤的一种。
根据上面的参数污染的知识点我们可以知道一点(此服务器的版本是apache),我们可以给他两个参数,但是最终指只会输出后面的那个参数。
所以我们得到了这个写法:
这个写法我们可以这样来理解
?id=1/**&id=-1 union select 1,2,3%23*/
我们将这句话拆开变成这样的:
前半部分:?id=1/**
后半部分:id=-1 union select 1,2,3#*/
由于安全狗会扫描全部,所以我们通过/***/来将后面这个部分当作一个参数来注释掉,这样安全狗扫描的就是一个空值,所以不会被拦截。
有因为apache只会显示最后一个值,而#刚好将后面的那个*/给注释掉了,所以,我们最终得到的值是这个:
union select 1,2,3#
这样就绕过了WAF进行注入
 
第三种方法:
我们可以使用Fuzz
什么是Fuzz?
fuzz其实就是一种对请求参数的模糊测试,简单来说就是对一个接口的某个参数或多个参数用自定义的内容进行批量提交,根据接口返回内容来判断自定义内容参数对接口的影响。
思路:
我们举个例子:
比如说这个,他就会把这里面的某个地方当作一个字典,批量的去写脚本,比如我们在%0A这个地方来进行测试,那就会变成0b,0c,0d等等等等,生成很多种可能性,然后就会生成很多种可能性,然后我们通过分析数据包来判断看看那个一数据包时返回了正常的页面,则那个页面的那个写法我们就可以称之为绕过了WAF。
posted @ 2022-07-03 00:47  Anime_Bucket  阅读(1453)  评论(0编辑  收藏  举报