本文作者:小刘某(实验室SRSP TEAM团队成员)
故事是这样开始的:
美丽的故事总是发生在夜深人静的时候(人们想睡觉的时候):
通用密码造成了麻烦。 我的直觉告诉我,它实际上应该相当于:
* 来自 =0 的用户;
但仔细一想,我觉得事情并没有那么简单:
于是我找到了我的大哥并讨论了:
那么从数据库原理的角度来说,如何解释呢? ? ?
所以我让他先自己想一想,准备深入了解数据库原理:
辩论期间事情往往会变得有趣:
也许我的说法不是很准确,但他没有做比较,所以随着测试的深入,问题变得更有趣:
你会发现''+0+''也是可以的
还可以发现''*0*''也是可以的
那么''^0^''也是可以的
四种算术运算和幂运算全部可用,并且输出结果一致! ? ! ?
伟大的哲学家总能发现问题。 这时候强哥成功投下一波重磅炸弹
问题变得越来越扑朔迷离,感觉像是一连串悬疑案件交织在一起!
这时候看来''和null的问题来了
在MySQL数据库中,''是空字符,null表示空。 两者内容不同。 问题的魔力往往在于:
看到这里你是不是一头雾水? 这时候我们就会想到MySQL的弱类型
如果类型是弱的,它会自行转换,所以此时1337和'1337'没有区别。
所以为了进一步验证我们的想法,我们设置了一些其他的查询语法
从上面的输出结果来看,在进行字符操作时,MySQL中的所有字符都在
视为0; 当字符前面有数字时,则将该数字作为该字符串的值。
至此问题基本解决了,我们测试一下
所以这里可以看出,''字符在进行运算时也被视为零。
这时候我们发现下面这句话
既然已经到了这一步,我们还不如继续玩下去,给自己制造点麻烦,只有你可以
思考解决问题。 。 。 。 。 。
于是经过一系列询问,我们最终得出以下结论:
说说MySQL的黑暗语法
所以这个世界上不仅有阳光,还有黑夜(心里有无数草泥马驰骋)
最后总结一下:
1、MySQL数据库中的数据是弱类型的。 弱类型字符在四次算术运算中将被视为 0。
2. MySQL中''和NULL是两个不同的值。
3. ''(空字符)遇到运算符时也会被视为0。
4.你必须了解MySQL中的暗语法,也许它是通用密码。 比如这个POC使用了MySQL的弱类型,使得查询条件最终变成=0
查询时,(va)char类型会按首字母为0进行处理,从而输出查询结果。
此时此刻,我的脑海里充满了哥德巴赫的猜想和华罗庚爷爷的一袋袋纸莎草纸。 。 。 。 。 。
参考链接:
扫描下方二维码加入星球学习
加入后,您将被邀请进入内部微信群。 内部微信群永久有效!