记一次奇妙的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问题:
- 编写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注入的技术细节和绕过思路,同时帮助开发人员加强应用安全防护。