对不起了系统,为了交差,我只能转走小道进行SQL注入了
字数 1140 2025-08-29 08:30:05

SQL注入绕过技术实战教学文档

0x00 背景介绍

本文记录了一个SQL注入漏洞的发现和利用过程,主要特点是目标系统对大多数SQL函数和关键字进行了过滤,但通过巧妙的绕过技术最终成功获取了数据库路径信息。

0x01 注入点发现

  1. 初始发现:测试中发现一个可通过单引号闭合的SQL注入点

    • 原始注入:' 能够实现完美闭合
    • 拦截情况:andor等关键字被检测拦截
  2. 初步绕过

    • 使用||代替or||在SQL中表示逻辑或)
    • 成功构造:'||1/1||' 验证注入存在

0x02 长度探测技术

  1. 长度判断方法

    • 使用减法代替等号(等号被拦截)
    • 示例:'||1/(length(123)-3)||'
      • length(123)=3时表达式为1/0导致错误
      • 其他情况返回正常
  2. 函数限制

    • 发现大多数常用函数被禁用,无法直接获取库名、用户名、版本等信息

0x03 高级绕过技术

  1. 路径信息获取

    • 目标:获取数据库路径@@datadir
    • 初始尝试:'||1/(length(@@datadir)-300)||'(300为假设值)
    • 问题:逗号被拦截
  2. 逗号绕过

    • 使用fromfor代替逗号
    • 最终构造:
      '||1/(ord(substr(@@datadir+from+1+for+1))-300)||'
      
    • 解释:
      • substr(string from start for length) 是标准SQL语法
      • ord()获取字符ASCII码
      • 通过不断调整300的值进行爆破
  3. 成功利用

    • 通过布尔盲注方式逐字符爆破出完整数据库路径
    • 虽然无法获取更多信息,但足以证明漏洞存在

0x04 关键知识点总结

  1. 绕过技术

    • 运算符替换:||代替or
    • 语法改写:from...for...代替逗号
    • 比较方式:减法代替等号比较
  2. 被拦截内容

    • 关键字:andor=
    • 符号:逗号
    • 函数:大多数信息获取函数
  3. 利用思路

    • 当主要信息获取途径被阻断时,寻找次要目标(如路径信息)
    • 使用标准SQL语法替代被拦截的简化语法
    • 布尔盲注作为最后手段

0x05 防御建议

  1. 使用参数化查询而非字符串拼接
  2. 不要依赖黑名单过滤,应采用白名单机制
  3. 最小权限原则,限制数据库用户权限
  4. 错误信息处理,避免泄露敏感信息
  5. ||等运算符也进行过滤或转义

0x06 扩展思考

  1. 其他可能的绕过方式:

    • 使用like进行模糊匹配
    • 尝试%00等空字节截断
    • 使用注释符分割语句
  2. 更全面的信息获取:

    • 尝试@@version_compile_os获取操作系统
    • 通过hex()函数绕过字符限制
    • 使用嵌套查询绕过直接函数调用

本案例展示了即使在被严格过滤的环境中,通过深入了解SQL语法标准和创造性思维,仍然可能找到注入途径。这强调了全面防御而非局部修补的重要性。

SQL注入绕过技术实战教学文档 0x00 背景介绍 本文记录了一个SQL注入漏洞的发现和利用过程,主要特点是目标系统对大多数SQL函数和关键字进行了过滤,但通过巧妙的绕过技术最终成功获取了数据库路径信息。 0x01 注入点发现 初始发现 :测试中发现一个可通过单引号闭合的SQL注入点 原始注入: ' 能够实现完美闭合 拦截情况: and 、 or 等关键字被检测拦截 初步绕过 : 使用 || 代替 or ( || 在SQL中表示逻辑或) 成功构造: '||1/1||' 验证注入存在 0x02 长度探测技术 长度判断方法 : 使用减法代替等号(等号被拦截) 示例: '||1/(length(123)-3)||' 当 length(123)=3 时表达式为 1/0 导致错误 其他情况返回正常 函数限制 : 发现大多数常用函数被禁用,无法直接获取库名、用户名、版本等信息 0x03 高级绕过技术 路径信息获取 : 目标:获取数据库路径 @@datadir 初始尝试: '||1/(length(@@datadir)-300)||' (300为假设值) 问题:逗号被拦截 逗号绕过 : 使用 from 和 for 代替逗号 最终构造: 解释: substr(string from start for length) 是标准SQL语法 ord() 获取字符ASCII码 通过不断调整300的值进行爆破 成功利用 : 通过布尔盲注方式逐字符爆破出完整数据库路径 虽然无法获取更多信息,但足以证明漏洞存在 0x04 关键知识点总结 绕过技术 : 运算符替换: || 代替 or 语法改写: from...for... 代替逗号 比较方式:减法代替等号比较 被拦截内容 : 关键字: and 、 or 、 = 符号:逗号 函数:大多数信息获取函数 利用思路 : 当主要信息获取途径被阻断时,寻找次要目标(如路径信息) 使用标准SQL语法替代被拦截的简化语法 布尔盲注作为最后手段 0x05 防御建议 使用参数化查询而非字符串拼接 不要依赖黑名单过滤,应采用白名单机制 最小权限原则,限制数据库用户权限 错误信息处理,避免泄露敏感信息 对 || 等运算符也进行过滤或转义 0x06 扩展思考 其他可能的绕过方式: 使用 like 进行模糊匹配 尝试 %00 等空字节截断 使用注释符分割语句 更全面的信息获取: 尝试 @@version_compile_os 获取操作系统 通过 hex() 函数绕过字符限制 使用嵌套查询绕过直接函数调用 本案例展示了即使在被严格过滤的环境中,通过深入了解SQL语法标准和创造性思维,仍然可能找到注入途径。这强调了全面防御而非局部修补的重要性。