记一次奇妙的Oracle注入绕WAF之旅
字数 1621 2025-08-29 22:41:10

Oracle SQL注入绕过WAF实战教学文档

0x00 前言

本文详细记录了一次针对Oracle数据库的SQL注入绕过WAF的实战过程,包含完整的测试思路、技术细节和绕过方法。通过本案例,读者可以学习到Oracle注入的特殊技巧和WAF绕过思路。

0x01 环境发现

初始发现

  • 目标:一个复古界面的登录框
  • 初步测试:使用admin'单引号测试,触发SQL报错
  • 常见万能密码测试失败,表明存在防护措施

关键特征

  • 请求包中包含sessionID参数,具有以下特点:
    • 不能复用
    • 每次请求需要从服务器重新获取
    • 有效期特别短

0x02 准备工作

代理设置

使用mitmproxy解决sessionID问题:

  1. 编写Python脚本自动替换请求包中的sessionID
  2. 启动代理服务,确保每次请求使用有效的sessionID

工具选择

  • 初始尝试使用sqlmap失败
  • 转为手工注入测试

0x03 数据库类型识别

排除法测试

  1. 排除MSSQL:基于JSP站点特征
  2. 排除MySQL
    • 双引号不敏感
    • #注释符报错
    • XOR运算(^)不支持
  3. 排除PostgreSQL
    • likeilike测试结果不符合PG特征

确认Oracle

  • 1=1条件可用
  • 支持like但不支持ilike
  • 最终确定为Oracle数据库

0x04 注入技术细节

基础测试

  • 成功闭合SQL语句:admin' or 1=1--
  • 注释符使用:--有效,#无效

函数测试

  1. ASCII函数

    • 确认可用:admin' or ascii('a')=1--
    • 相当于:admin' or false --
  2. 除零报错特性

    • Oracle不支持除0运算,会报错
    • 构造payload:admin' or 1/0=1--

盲注技术

  1. 条件判断

    • 利用除零报错构造条件判断
    • 示例:admin' or (case when (ascii('a')=97) then 1 else 1/0 end)=1--
  2. 数据提取

    • 发现user函数可用
    • 构造payload:admin' or (case when (ascii(substr(user,1,1))=83) then 1 else 1/0 end)=1--

自动化测试

  • 使用Yakit等工具进行爆破
  • 构造payload集进行自动化测试

0x05 WAF绕过技巧

  1. 函数混淆

    • 测试各种Oracle函数可用性
    • 寻找未被WAF拦截的函数组合
  2. 语法变形

    • 尝试不同的SQL语法结构
    • 使用Oracle特有的语法特性
  3. 时间延迟

    • 在盲注中结合时间延迟判断
  4. IP轮换

    • 由于目标会ban IP,需要准备多个IP地址轮换

0x06 完整测试流程总结

  1. 从登录框开始测试
  2. 构造1=1成功闭合SQL语句
  3. 通过#注释符排除MySQL
  4. 通过XOR运算再次确认非MySQL
  5. 使用likeilike排除PostgreSQL
  6. 函数过滤fuzz测试
  7. 利用除零报错特性
  8. 找到可用的user函数
  9. 构建完整注入payload

0x07 经验总结

  1. 盲注挑战

    • 需要区分语法错误、函数不可用和WAF拦截
    • 每个测试步骤都需要多次验证
  2. 时间消耗

    • 主要时间花在fuzz测试和寻找可用函数
    • 需要耐心和系统的测试方法
  3. 知识储备

    • 熟悉各种数据库的特性和差异
    • 积累常见WAF的绕过技巧
  4. 工具辅助

    • 合理使用代理工具解决会话问题
    • 结合自动化工具提高效率

0x08 防御建议

  1. 输入验证

    • 实施严格的输入过滤
    • 使用参数化查询
  2. 错误处理

    • 自定义错误页面
    • 避免泄露数据库信息
  3. WAF配置

    • 及时更新WAF规则
    • 监控和阻断异常请求模式
  4. 会话管理

    • 保持现有的sessionID安全机制
    • 考虑增加二次验证

通过本案例的详细分析,安全研究人员可以深入了解Oracle注入的技术细节和绕过思路,同时帮助开发人员加强应用安全防护。

Oracle SQL注入绕过WAF实战教学文档 0x00 前言 本文详细记录了一次针对Oracle数据库的SQL注入绕过WAF的实战过程,包含完整的测试思路、技术细节和绕过方法。通过本案例,读者可以学习到Oracle注入的特殊技巧和WAF绕过思路。 0x01 环境发现 初始发现 目标:一个复古界面的登录框 初步测试:使用 admin' 单引号测试,触发SQL报错 常见万能密码测试失败,表明存在防护措施 关键特征 请求包中包含 sessionID 参数,具有以下特点: 不能复用 每次请求需要从服务器重新获取 有效期特别短 0x02 准备工作 代理设置 使用 mitmproxy 解决sessionID问题: 编写Python脚本自动替换请求包中的sessionID 启动代理服务,确保每次请求使用有效的sessionID 工具选择 初始尝试使用sqlmap失败 转为手工注入测试 0x03 数据库类型识别 排除法测试 排除MSSQL :基于JSP站点特征 排除MySQL : 双引号不敏感 # 注释符报错 XOR运算( ^ )不支持 排除PostgreSQL : like 和 ilike 测试结果不符合PG特征 确认Oracle 1=1 条件可用 支持 like 但不支持 ilike 最终确定为Oracle数据库 0x04 注入技术细节 基础测试 成功闭合SQL语句: admin' or 1=1-- 注释符使用: -- 有效, # 无效 函数测试 ASCII函数 : 确认可用: admin' or ascii('a')=1-- 相当于: admin' or false -- 除零报错特性 : Oracle不支持除0运算,会报错 构造payload: admin' or 1/0=1-- 盲注技术 条件判断 : 利用除零报错构造条件判断 示例: admin' or (case when (ascii('a')=97) then 1 else 1/0 end)=1-- 数据提取 : 发现 user 函数可用 构造payload: admin' or (case when (ascii(substr(user,1,1))=83) then 1 else 1/0 end)=1-- 自动化测试 使用Yakit等工具进行爆破 构造payload集进行自动化测试 0x05 WAF绕过技巧 函数混淆 : 测试各种Oracle函数可用性 寻找未被WAF拦截的函数组合 语法变形 : 尝试不同的SQL语法结构 使用Oracle特有的语法特性 时间延迟 : 在盲注中结合时间延迟判断 IP轮换 : 由于目标会ban IP,需要准备多个IP地址轮换 0x06 完整测试流程总结 从登录框开始测试 构造 1=1 成功闭合SQL语句 通过 # 注释符排除MySQL 通过XOR运算再次确认非MySQL 使用 like 和 ilike 排除PostgreSQL 函数过滤fuzz测试 利用除零报错特性 找到可用的 user 函数 构建完整注入payload 0x07 经验总结 盲注挑战 : 需要区分语法错误、函数不可用和WAF拦截 每个测试步骤都需要多次验证 时间消耗 : 主要时间花在fuzz测试和寻找可用函数 需要耐心和系统的测试方法 知识储备 : 熟悉各种数据库的特性和差异 积累常见WAF的绕过技巧 工具辅助 : 合理使用代理工具解决会话问题 结合自动化工具提高效率 0x08 防御建议 输入验证 : 实施严格的输入过滤 使用参数化查询 错误处理 : 自定义错误页面 避免泄露数据库信息 WAF配置 : 及时更新WAF规则 监控和阻断异常请求模式 会话管理 : 保持现有的sessionID安全机制 考虑增加二次验证 通过本案例的详细分析,安全研究人员可以深入了解Oracle注入的技术细节和绕过思路,同时帮助开发人员加强应用安全防护。