当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0121291

漏洞标题:一次艰难的安全狗规则绕过

相关厂商:安全狗

漏洞作者: MayIKissYou

提交时间:2015-06-18 08:53

修复时间:2015-09-16 10:16

公开时间:2015-09-16 10:16

漏洞类型:设计错误/逻辑缺陷

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-18: 细节已通知厂商并且等待厂商处理中
2015-06-18: 厂商已经确认,细节仅向厂商公开
2015-06-21: 细节向第三方安全合作伙伴开放
2015-08-12: 细节向核心白帽子及相关领域专家公开
2015-08-22: 细节向普通白帽子公开
2015-09-01: 细节向实习白帽子公开
2015-09-16: 细节向公众公开

简要描述:

估计下面评论又要开始诅咒了。。。。。

详细说明:

1:篇前先附送一个sql注入绕过,字符是%a0,这个字符之前是修正果的,我记得上个版本有两个字符没有过滤的,估计是redfree同学上报了之后,给修复了,但是竟然修复之后的规则还带回滚的,现在又支持%a0的绕过了。
就不去刷rank了。
这个不细说了,进入正文。
2:测试的安全狗的版本是

anquangou1.png


这个应该是最新的版本,今天刚在官网上下载的
3:本机的测试环境是:
操作系统:win7
应用环境:wamp
安全狗:windows apache版本
因此这里也是针对的是主流的mysql环境
做绕过的时候可以利用各个层面的特性去绕过,
这次测试绕过的方向主要是通过mysql的特性去做绕过。
下面来看这个艰难的过程。
4:测试sql注入规则绕过的时候,我一般都会先去测试 []select[][]from[]这个点的规则
经过大量的反复的测试,这里我们得到如下的结果:
除开%a0以外,基本上在安全狗的环境下:
上面方括号代表位置1-4
1):位置1允许a-z,A-Z以及_和数字
2):位置2允许a-z,A-Z以及_和数字
3):位置3允许a-z,A-Z以及_
4):位置4允许a-z,A-Z以及_和数字
5:知晓各个点的过滤情况之后接下来就是在脑[wen]海[dang]里翻阅资料,翻阅到之前的那个精华帖子

http://zone.wooyun.org/content/16772


里面使用了一个字符引起了注意:

select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0


这里这个\N的字符能用在union这,能不能用在\Nfrom前面呢,如果能用在from前面可能我们就能够绕过select from的检测
6:在mysql console下进行测试发现:

anquangou2.png


7:因此这里我们便可以使用这样的payload绕过select from的检测

select 1,\Nfrom table


anquangou3.png


8:我们的目的是要能绕过安全狗防护爆出数据,本来以为可以直接就爆出数据,但是在测试的过程中又发现了一些问题。

anquangou4.png


分析:
由于我们做数据读取的时候,会用到如下的语句
select schema_name from information_schema.schemata limit 1
这里又由于我们要绕过select from的限制,因此我们就要使用select 1,\N的形式。
而这里我们可以看出来报错貌似要求我们只能有一列的返回结果,但是我们由于引入了
\N符号,我们必须要有两列。
9:之前有作过如下的测试:

anquangou5.png


可以看出两列也是可以做大小判断的,这里我们利用这个trick,因此我们至少可以试试盲注。
我们先用盲注,然后再试试难度较大的报错
10:我的第一个schema_name的长度是18,结果为真的时候显示了数据库记录

anquangou6.png


11:结果为假的时候显示为空

anquangou7.png


果真可以盲住。
12:接下来我们来看看如何进行报错的注入,我擦勒,又在脑[wen]海[dang]里想了想,又是好长段时间过去了,发现
有如下记录:

http://zone.wooyun.org/content/13270


里面提到了

mysql> SELECT 2 * if((SELECT * from (select * from test.shop) as `` limit 1)>(SELECT * from test.shop limit 1), 18446744073709551610, 18446744073709551610);ERROR 
1690 (22003): BIGINT UNSIGNED value is out of range in '(2 * if(((select `article`,`dealer`,`price` from (select `test`.`shop`.`article` AS `article`,`test`.`shop`.`dealer` AS `dealer`,`test`.`shop`.`price` AS `price` from `test`.`shop`) limit 1) > (select `test`.`shop`.`article`,`test`.`shop`.`dealer`,`test`.`shop`.`price` from `test`.`shop` limit 1)),18446744073709551610,18446744073709551610))'


13:这个报错有限制,提示是mysql5.5版本以上才能使用,既然如此我们试试

anquangou9.png


这个大概知道了,就应该是两边长度不一样,既然这样粗暴点直接给补齐再试试:

anquangou10.png


篇后语:
市面上在过滤的时候都会允许select和from之间添加英文字符的,这样的waf规则都会被
这种方法给bypass。估计够各厂商喝一壶了。
到此结束!

漏洞证明:

9:之前有作过如下的测试:

anquangou5.png


可以看出两列也是可以做大小判断的,因此我们至少可以试试盲注入。
我们先用盲注,然后再试试难度大的报错
10:我的第一个schema_name的长度是18,结果为真的时候显示了数据库记录

anquangou6.png


11:结果为假的时候显示为空

anquangou7.png


果真可以盲住。
12:接下来我们来看看如何进行报错的注入,我擦勒,又在脑[wen]海[dang]里想了想,又是好长段时间过去了,发现
有如下记录:

http://zone.wooyun.org/content/13270


里面提到了

mysql> SELECT 2 * if((SELECT * from (select * from test.shop) as `` limit 1)>(SELECT * from test.shop limit 1), 18446744073709551610, 18446744073709551610);ERROR 
1690 (22003): BIGINT UNSIGNED value is out of range in '(2 * if(((select `article`,`dealer`,`price` from (select `test`.`shop`.`article` AS `article`,`test`.`shop`.`dealer` AS `dealer`,`test`.`shop`.`price` AS `price` from `test`.`shop`) limit 1) > (select `test`.`shop`.`article`,`test`.`shop`.`dealer`,`test`.`shop`.`price` from `test`.`shop` limit 1)),18446744073709551610,18446744073709551610))'


13:这个报错有限制,提示是mysql5.5版本以上才能使用,既然如此我们试试

anquangou9.png


这个大概知道了,就应该是两边长度不一样,既然这样粗暴点直接给补齐再试试:

anquangou10.png


篇后语:
市面上在过滤的时候都会允许select和from之间添加英文字符的,这样的waf规则都会被
这种方法给bypass。
到此结束!

修复方案:

这次感觉要添加特例了

版权声明:转载请注明来源 MayIKissYou@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-06-18 10:15

厂商回复:

小伙伴们今天真是热情,接连报了两个问题,在此表示深深的感谢。
我们会尽快修复这个问题。

最新状态:

暂无