一、前言
最近发现一个比较有意思的sql语句,使用like但是没有使用模糊查询,却匹配出了所有的字段
二、学习
1、int 型
n_id存在且n_id=1
n_id存在且n_id=2
由上可知,当字段值类型未int时,字段值=1 like 1(表达式为Ture),即效果为n_id=1,字段值=1 like 2(表达式为False),即效果为n_id=0,mysql中列值从1开始,因此返回为空,n_id=666 ,n_id不存在;进一步验证猜想
2、字符串型
根据前面的测试,意识到可能存在运算符的优先级问题,like优先级高于=,下面两条语句等价
select * from t_emm_sys_user where c_user_name=1 like 2;
select * from t_emm_sys_user where c_user_name=(1 like 2);
当字段类型为字符串时,字段值=1 like 1(表达式为True),效果为or 1=0 , 字段值=1 like 2(表达式为False),效果为or 1=1
3、其他玩法
1、判断列名是否存在
2、万能密码
同样还是like语句返回True OR False ,也就是1 OR 0 的问题,在列表为字符串类型的时候,这里就可以实现or 1=1的效果,只要构造出
(xx' like aaa)为False即可