异或注入

mySQL在做String类型与数字类型的比较时, 如果字符串前面是数字,转换时就是转换成前面的数字,然后再进行比较. 比如: '1aaa' ==> 1如果字符串前面不是数字, 转换时就将其变成0进行比较.比如: 'aaa' ==>0

结果是1, 表示true

结果是1, 表示true

image-20240427195109704

结果是0, 表示false

如何进行异或?

异或操作(^)是一种逻辑运算符,用于比较两个二进制位。在异或操作中,如果两个二进制位相同,则结果为0;如果两个二进制位不同,则结果为1。

1
2
3
4
5
6
7
8
9
计算1 ^ 2
1 的二进制表示是 0001,
2 的二进制表示是 0010。

0001 (1)
0010 (2)
-------
0011 (3)
所以 1 ^ 2 = 3

什么是异或注入?

异或注入说简单一点就是在构造where后面的判断条件时使用 ^(异或符号)来达到sql注入攻击的目的

一、 正常的查询语句及效果

image-20240427200022077

二、拼接异或条件的查询语句

1.

image-20240427201841964

2.

image-20240427201944458

为什么会有这个结果呢?

对于图1

首先: 'Keli'会与0做异或运算,结果为0. 然后查询语句相当于变成了select * from yuanshen where mengde=0, 而 不以数字开头的字符型数据 与 数值数据 进行比较时会转换成0再进行比较。故会将mengde字段中数据为Keli的这一行显示出来。

再向表中添加几条内容再次进行查询

image-20240427203648971

会查询出mengde字段中数据为0的列,以及开头字母为0的字符串数据的列.

图二原理与图一一样

三、如何使用异或来进行注入?

image-20240427204236952

查询后面拼接(length(database()) != [表示数据库长度的数] )查询, 若结果为true,则返回1此时会查出mengde字段中数据为1的数据(显示的数据与前面查询的不一样, 页面报错或显示其他内容), 若结果为false,则返回0,此时会查出mengde字段中数据为0的数据(显示的数据与前面查询的一样或者更多, 页面与前面查询的一样或显示更多内容)

四、后续测试

后续测试可以结合ascii函数进行