一次漏洞挖掘过程中的SQL注入浅浅绕过记录
字数 928 2025-08-29 08:30:24

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

0x00 背景介绍

本案例描述了一个针对CMS系统的SQL注入漏洞发现与绕过过程。目标网站存在SQL注入漏洞,但开发了多种安全防护措施,包括:

  • 单引号转义(转换为\'
  • 逗号过滤
  • 引号限制

0x01 漏洞发现

初始发现

  • 通过测试发现网站存在SQL注入漏洞
  • 报错信息中返回了原始SQL语句片段:in(\'\')
  • 推断原始SQL语句格式为:select * from xlz where id in ($id)

安全防护分析

  1. 引号处理

    • 单引号、双引号、斜杠等特殊字符会被转义
    • 例如:'\'
  2. 错误表现

    • 当注入特殊字符时,系统会直接报错

0x02 注入绕过技术

1. 基础Payload构造

初始有效Payload格式:

11)AND(CASE+WHEN(1=1)+THEN+1+ELSE+exp(710)+END

2. 绕过逗号过滤

发现substr()函数中的逗号被过滤,使用from for语法替代:

传统写法:

substr(database(),1,1)

绕过写法:

substr(database() from 1 for 1)

3. 绕过引号限制

由于引号被转义,使用ASCII码函数替代字符串比较:

传统写法:

substr(database(),1,1)='a'

绕过写法:

ascii(substr(database() from 1 for 1))=97

4. 完整Payload示例

获取数据库名的Payload:

11)AND(CASE+WHEN(ascii(Substr(database()+from+1+for+1))=1)+THEN+1+ELSE+exp(710)+END

0x03 注入流程

  1. 判断数据库名长度

    • 使用二分法判断长度
    • 示例:判断长度为14
  2. 逐字符获取数据库名

    • 通过修改fromfor参数获取每个字符
    • 使用ASCII码比较确定具体字符
  3. 数据提取

    • 同样的方法可应用于获取表名、字段名和数据
    • 只需修改database()为相应查询语句

0x04 防御建议

针对此类注入攻击,建议采取以下防护措施:

  1. 输入验证

    • 严格限制输入数据类型和格式
    • 使用白名单验证
  2. 参数化查询

    • 使用预处理语句和参数化查询
  3. 最小权限原则

    • 数据库账户使用最小必要权限
  4. 错误处理

    • 自定义错误信息,避免泄露系统细节
  5. 多层防护

    • 结合WAF和其他安全措施

0x05 总结

本案例展示了如何绕过多种SQL注入防护措施:

  1. 使用CASE WHEN结构绕过基础过滤
  2. 使用from for语法替代被过滤的逗号
  3. 使用ASCII码比较避免引号使用
  4. 通过报错信息推断原始SQL结构

这种技术适用于存在类似防护措施的Web应用,强调了安全防护需要多层次、多角度的考虑。

SQL注入绕过技术实战教学文档 0x00 背景介绍 本案例描述了一个针对CMS系统的SQL注入漏洞发现与绕过过程。目标网站存在SQL注入漏洞,但开发了多种安全防护措施,包括: 单引号转义(转换为 \' ) 逗号过滤 引号限制 0x01 漏洞发现 初始发现 通过测试发现网站存在SQL注入漏洞 报错信息中返回了原始SQL语句片段: in(\'\') 推断原始SQL语句格式为: select * from xlz where id in ($id) 安全防护分析 引号处理 : 单引号、双引号、斜杠等特殊字符会被转义 例如: ' → \' 错误表现 : 当注入特殊字符时,系统会直接报错 0x02 注入绕过技术 1. 基础Payload构造 初始有效Payload格式: 2. 绕过逗号过滤 发现 substr() 函数中的逗号被过滤,使用 from for 语法替代: 传统写法: 绕过写法: 3. 绕过引号限制 由于引号被转义,使用ASCII码函数替代字符串比较: 传统写法: 绕过写法: 4. 完整Payload示例 获取数据库名的Payload: 0x03 注入流程 判断数据库名长度 : 使用二分法判断长度 示例:判断长度为14 逐字符获取数据库名 : 通过修改 from 和 for 参数获取每个字符 使用ASCII码比较确定具体字符 数据提取 : 同样的方法可应用于获取表名、字段名和数据 只需修改 database() 为相应查询语句 0x04 防御建议 针对此类注入攻击,建议采取以下防护措施: 输入验证 : 严格限制输入数据类型和格式 使用白名单验证 参数化查询 : 使用预处理语句和参数化查询 最小权限原则 : 数据库账户使用最小必要权限 错误处理 : 自定义错误信息,避免泄露系统细节 多层防护 : 结合WAF和其他安全措施 0x05 总结 本案例展示了如何绕过多种SQL注入防护措施: 使用 CASE WHEN 结构绕过基础过滤 使用 from for 语法替代被过滤的逗号 使用ASCII码比较避免引号使用 通过报错信息推断原始SQL结构 这种技术适用于存在类似防护措施的Web应用,强调了安全防护需要多层次、多角度的考虑。