src漏洞挖掘篇之报错注入案例
字数 1211 2025-08-10 08:28:18

报错注入漏洞挖掘与利用实战教学

一、漏洞背景与发现

报错注入是SQL注入的一种形式,通过故意构造错误的SQL语句,使数据库返回错误信息,从而获取敏感数据。本案例发生在Java开发的系统中,通过以下步骤发现:

  1. 目标发现:通过C段扫描发现目标系统
  2. 初始访问:利用弱口令获得系统访问权限
  3. 技术环境:后端为Java,已实现全局预编译和鉴权机制

二、漏洞挖掘过程

1. 寻找注入点

在已做预编译的系统中,寻找注入点的策略:

  • 优先检查排序(order by)筛选等功能点
  • 这些功能通常在SQL语句的ORDER BY子句后实现,较易出现注入漏洞

2. 测试步骤

  1. 抓包分析

    • 使用筛选功能并抓取请求
    • 发现sqlWhere参数可能存在问题
  2. 初步测试

    • 对参数值进行URL解码
    • 输入单引号'测试,系统返回错误,确认存在注入漏洞
  3. 定位注入位置

    • 输入selectttt等无效语句,通过错误信息定位SQL语句结构

三、报错注入技术详解

1. 报错注入原理

利用数据库函数故意产生错误,将查询结果通过错误信息返回:

  • 常用函数:updatexml()extractvalue()floor()
  • 本案例中sleep()函数被禁用,但benchmark()仍可用

2. 注入技术实现

  1. 基础验证

    and updatexml(1, concat(0x7e, (select 1)), 1)
    
    • 返回结果中包含select 1的输出,确认注入可行
  2. 绕过过滤

    • 发现user()等常见函数被过滤
    • 使用current_user成功获取当前用户名
  3. 进阶利用尝试

    • 尝试爆数据库名、表名,但遇到较多过滤
    • 最终成功获取当前用户信息

四、防御措施

1. 开发层面

  1. 参数化查询

    • 即使使用预编译,也要确保所有动态参数都正确处理
    • 特别注意ORDER BY等无法直接参数化的场景
  2. 输入过滤

    • 对特殊字符和SQL关键字进行过滤
    • 但要注意不要仅依赖黑名单
  3. 错误处理

    • 自定义错误页面,避免泄露数据库错误信息

2. 运维层面

  1. 权限控制

    • 数据库用户使用最小权限原则
    • 避免使用高权限账户连接应用
  2. WAF部署

    • 部署Web应用防火墙拦截注入尝试
    • 但要注意WAF可能被绕过

五、实战技巧总结

  1. 目标选择

    • 在已做预编译的系统中,优先测试排序、筛选功能
    • 关注ORDER BYGROUP BY等子句
  2. 测试方法

    • 使用单引号触发错误确认漏洞
    • 通过故意输入无效语句定位注入位置
  3. 绕过技巧

    • 当常见函数被过滤时,尝试替代方案
    • user()被过滤可尝试current_user
  4. 结果利用

    • 即使只能获取有限信息(如当前用户),也可能构成高危漏洞
    • 根据获取的信息进一步深入测试

六、附录:常用报错注入Payload

  1. MySQL报错注入:

    and updatexml(1, concat(0x7e, (select @@version)), 1)
    and extractvalue(1, concat(0x7e, (select user())))
    
  2. 替代函数:

    and (select 1 from (select count(*),concat((select current_user),floor(rand(0)*2))x from information_schema.tables group by x)a)
    
  3. 基准函数替代延时:

    and benchmark(10000000,md5('test'))
    

通过本案例可以学习到,即使系统做了预编译等防护措施,仍然可能存在注入漏洞,关键在于找到未正确防护的功能点。

报错注入漏洞挖掘与利用实战教学 一、漏洞背景与发现 报错注入是SQL注入的一种形式,通过故意构造错误的SQL语句,使数据库返回错误信息,从而获取敏感数据。本案例发生在Java开发的系统中,通过以下步骤发现: 目标发现 :通过C段扫描发现目标系统 初始访问 :利用弱口令获得系统访问权限 技术环境 :后端为Java,已实现全局预编译和鉴权机制 二、漏洞挖掘过程 1. 寻找注入点 在已做预编译的系统中,寻找注入点的策略: 优先检查 排序(order by) 、 筛选 等功能点 这些功能通常在SQL语句的 ORDER BY 子句后实现,较易出现注入漏洞 2. 测试步骤 抓包分析 : 使用筛选功能并抓取请求 发现 sqlWhere 参数可能存在问题 初步测试 : 对参数值进行URL解码 输入单引号 ' 测试,系统返回错误,确认存在注入漏洞 定位注入位置 : 输入 selectttt 等无效语句,通过错误信息定位SQL语句结构 三、报错注入技术详解 1. 报错注入原理 利用数据库函数故意产生错误,将查询结果通过错误信息返回: 常用函数: updatexml() 、 extractvalue() 、 floor() 等 本案例中 sleep() 函数被禁用,但 benchmark() 仍可用 2. 注入技术实现 基础验证 : 返回结果中包含 select 1 的输出,确认注入可行 绕过过滤 : 发现 user() 等常见函数被过滤 使用 current_user 成功获取当前用户名 进阶利用尝试 : 尝试爆数据库名、表名,但遇到较多过滤 最终成功获取当前用户信息 四、防御措施 1. 开发层面 参数化查询 : 即使使用预编译,也要确保所有动态参数都正确处理 特别注意 ORDER BY 等无法直接参数化的场景 输入过滤 : 对特殊字符和SQL关键字进行过滤 但要注意不要仅依赖黑名单 错误处理 : 自定义错误页面,避免泄露数据库错误信息 2. 运维层面 权限控制 : 数据库用户使用最小权限原则 避免使用高权限账户连接应用 WAF部署 : 部署Web应用防火墙拦截注入尝试 但要注意WAF可能被绕过 五、实战技巧总结 目标选择 : 在已做预编译的系统中,优先测试排序、筛选功能 关注 ORDER BY 、 GROUP BY 等子句 测试方法 : 使用单引号触发错误确认漏洞 通过故意输入无效语句定位注入位置 绕过技巧 : 当常见函数被过滤时,尝试替代方案 如 user() 被过滤可尝试 current_user 结果利用 : 即使只能获取有限信息(如当前用户),也可能构成高危漏洞 根据获取的信息进一步深入测试 六、附录:常用报错注入Payload MySQL报错注入: 替代函数: 基准函数替代延时: 通过本案例可以学习到,即使系统做了预编译等防护措施,仍然可能存在注入漏洞,关键在于找到未正确防护的功能点。