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