Mysql隐式转化

最近在学sql注入,在靶场练习时,遇到一个问题:如果是字符型的注入,在数据库中查询时,select * from user where name=‘a and1=1'和'a and1=2 '的结果为何为空?
答:
这里用到了mysql隐式转化:先看下图:
select 1+'1'; //本来数字型和字符型不可以做运算。这里把字符型的1转换成了数字型的,参与了运算,所以输出结果是2;

select concat(2,'test'); //用concat函数把两个连接在一起,将数字型的2转换成了字符型的于后面的test连接输出;

clipboard.png

含义:
当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)

转换规则:
当把字符串转换为数字的时候,其实从左边开始:

1.如果字符串的**第一个字符就是非数字的字符**,那么转换为**数字就是0**
  例如:select * from user where  name='a and 1=1';//字符串的第一个字符是a,那么不管后面是什么,结果都是数字0;

 2.如果字符串**以数字开头**:
   如果字符串中**都是数字**,那么转换为数字就是整个字符**串对应的数字**
       例如:select '232433';//结果是232433

  如果字符串中**存在非数字**,那么转换为的数字就是**开头的那些数字对应的值**
      例如:select '2aaaa23a';//结果是2

clipboard2.png

标签: none

添加新评论