MySQL WHERE语句中,等号”=”通常作为判断的条件,然而这个等号却是弱类型的判断,如果忽略了这一点,很容易造成安全问题,以下我便整理一下我所知道的匪夷所思的“相等”.。
1.字符型和数字型
MySQL的等号同PHP一样,对等号两端不同的数据类型都有强制类型转换,如下
但是却没有PHP的弱类型判断
这个的应用范围很局限,但是又不得忽视,所以开发者在字段的数据类型的选择以及sql语句的构造方面,要多多注意,防止等号两边类型不相同导致的漏洞。
2.尾空格
MySQL等号对字符串尾部的空格做忽视的处理,所以我们可以构造一个’abc’=’abc ’的效果,绕过某些特定串整体检查的WAF,不过相对来说,这个也比较鸡肋,因为很少有用字符串直接比对来过滤某些敏感串的。
这个可以直接用trim函数来避免
3.unicode字符集相似字符
其中有些相似字符,比如下面这个与a相似
这样会造成什么后果呢?
看到了吧,MySQL的等号认为这些相似字符也是相等的,这样的话,我们就可以完全绕过对敏感串的过滤,前提是在UTF8编码下。
4.新型万能密码
username='wupco'=''
这是有2个等号,然后计算顺序从左到右,
先计算username='wupco'
如果没有这个记录,则返回false
然后false=''
就成了true
所以这个就变成了where 1
达到了万能密码的效果