目录

  1. 1. 前言
  2. 2. 环境搭建
  3. 3. 操作
  4. 4. 利用
  5. 5. 结论

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

对MySQL弱类型比较的探索

2023/5/8 Web Sql
  |     |   总文章阅读量:

前言

做ctfshow web188遇到的一种类似php的特性,遂记之

外链

环境搭建

本地使用小皮工具箱创建数据库,采用SQL_Front实现数据库可视化

操作

创建一个表

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `score` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

image-20230508203929378

插入数据(此处个人环境原因需要使用IGNORE无视异常强制执行),执行完记得刷新数据表

INSERT IGNORE INTO `test` (`name`,`score`) VALUES ('张三', '100');
INSERT IGNORE INTO `test` (`name`,`score`) VALUES ('1伍', '99分');
INSERT IGNORE INTO `test` (`name`,`score`) VALUES ('2呃', '分数');
INSERT IGNORE INTO `test` (`name`,`score`) VALUES ('3无', 97);

image-20230508204733157

在插入数据的语句中尝试了多种类型,最后的执行结果如上,

可见第二行和第三行发生了隐式数据转换,score的值分别为99和0

类似于php中的弱类型

<?php
    echo 1+'2a';
// 最后输出3

再插入一条语句

INSERT INTO `test` (`name`,`score`) VALUES (1, '95');

插入成功

image-20230508205733172

所以:在插入MySQL数据的时候,字符型数据和整数型数据可以发生隐式的转换

利用

众所周知select语句可以查询对应列的字段值

那如果我们在这个数据库中查name=0时会发生什么呢?

select * from test where name=0

image-20230508210218354

会发现所有以字符串为开头的字段被全部查询

而当我们给0加上引号时,可以发现查询不到内容

image-20230508210348093

这里再用数字形式查询一下别的列名,可以发现同样能查询到相关开头的字段

image-20230508210451540

结论

与PHP弱类型类似

字母与文字开头的列名转换为数字都是0,所以=0能查出来

数字开头的字符串的列名转换为数字则会是开头的数字,所以=对应数字也能查出来