MYSQL弱类型转换

1.一个普通的查询语句

mysql的隐形类型转换select * from admin where u_name=” and u_pass=”;

程序将通过表单传递的用户名及密码传入上述语句。

2.一个特殊情况

假设用户传入的用户名为  ‘-

用户传入的密码为’

那么上述SQL语句为:

select * from admin where u_name=”-‘ and u_pass=”’;

u_name的右侧变成 ” – ‘string’,成为一个算数运算。

而通过cast()函数测试后发现字符串转为算数值时会将字符串开头的一串数字作为其转换后的数值,比如

’02admin’ ==>2

‘admin’==>0

’33admin’==>33

那么原先查询的SQL语句中u_name的右侧变为0-0=0

而u_name的弱类型转换值如果为0的话,那么所有的用户都将被检索到。

问题是如果用户名是以一个随机的数字开始,那么就可能不会匹配出所有的记录,甚至一条都不会。

 

这个特性可用于绕过WAF检测.不过如果后端程序对单引号进行了适当处理,那么该特性就无法造成SQL注入。