前言
做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;
插入数据(此处个人环境原因需要使用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);
在插入数据的语句中尝试了多种类型,最后的执行结果如上,
可见第二行和第三行发生了隐式数据转换,score的值分别为99和0
类似于php中的弱类型
<?php
echo 1+'2a';
// 最后输出3
再插入一条语句
INSERT INTO `test` (`name`,`score`) VALUES (1, '95');
插入成功
所以:在插入MySQL数据的时候,字符型数据和整数型数据可以发生隐式的转换
利用
众所周知select语句可以查询对应列的字段值
那如果我们在这个数据库中查name=0
时会发生什么呢?
select * from test where name=0
会发现所有以字符串为开头的字段被全部查询
而当我们给0加上引号时,可以发现查询不到内容
这里再用数字形式查询一下别的列名,可以发现同样能查询到相关开头的字段
结论
与PHP弱类型类似
字母与文字开头的列名转换为数字都是0,所以=0
能查出来
数字开头的字符串的列名转换为数字则会是开头的数字,所以=对应数字
也能查出来