mysql的弱类型转换

1.在SQL中,字符串类型与数字之间转换是不需要强制类型转换符的,如果字符串是一个数字字符串则直接转型为数字类型,否则将会报错。

2.在SQL中,如果某一字段数据类型为字符类型,必须加’’(单引号),除非该数值为数字形式。

3.在SQL中,有一个有趣的现象如果DATETIME类型的数据不加单引号,系统会给一个默认的时间。

此外SQL中还有两个类型转换函数:

1.CAST ( expression AS data_type)

2.CONVERT ( data_type, expression,[style])

SQL中如果+号两边分别为数字与字符串类型的两个数据,则按数字加法处理,如果字符串类型不能强制转型为数字,则报错。

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图1

此代码片段将发生错误,正确应该如下:

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图2

例子

1.一个普通的查询语句

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

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图3

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

2.一个特殊情况

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

那么上述SQL语句为:

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

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图4

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

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

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图5

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

隐形字段可能导致该字段的索引应用不了而进行全表扫描

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

题目

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图6

这username用bp跑出来SQL注入有很多过滤的东西。

查看源码后发现

mysql弱类型转换(2020-XCTF-sqlcheckin) - 图7

payload:

username:admin

password:0’-‘0