异或注入
mySQL在做String类型与数字类型的比较时, 如果字符串前面是数字,转换时就是转换成前面的数字,然后再进行比较. 比如: '1aaa' ==> 1
如果字符串前面不是数字, 转换时就将其变成0进行比较.比如: 'aaa' ==>0
结果是1, 表示true
结果是0, 表示false
如何进行异或?
异或操作(^)是一种逻辑运算符,用于比较两个二进制位。在异或操作中,如果两个二进制位相同,则结果为0;如果两个二进制位不同,则结果为1。
计算1 ^ 2
1 的二进制表示是 0001,
2 的二进制表示是 0010。
0001 (1)
0010 (2)
-------
0011 (3)
所以 1 ^ 2 = 3
什么是异或注入?
异或注入说简单一点就是在构造where后面的判断条件时使用 ^(异或符号)来达到sql注入攻击的目的
一、 正常的查询语句及效果
二、拼接异或条件的查询语句
为什么会有这个结果呢?
对于图1
首先: 'Keli'
会与0
做异或运算,结果为0
. 然后查询语句相当于变成了select * from yuanshen where mengde=0
, 而 不以数字开头的字符型数据 与 数值数据 进行比较时会转换成0
再进行比较。故会将mengde字段中数据为Keli的这一行显示出来。
再向表中添加几条内容再次进行查询
会查询出mengde
字段中数据为0的列,以及开头字母为0的字符串数据的列.
图二原理与图一一样
三、如何使用异或来进行注入?
查询后面拼接(length(database()) != [表示数据库长度的数] )
查询, 若结果为true
,则返回1
此时会查出mengde
字段中数据为1的数据(显示的数据与前面查询的不一样, 页面报错或显示其他内容), 若结果为false
,则返回0
,此时会查出mengde
字段中数据为0的数据(显示的数据与前面查询的一样或者更多, 页面与前面查询的一样或显示更多内容)
四、后续测试
后续测试可以结合ascii
函数进行
最后:欢迎大家关注我的公众号