◈ 渗透任务 企业论坛留言板安全评估 任务中
你的身份 「暗影安全公司」渗透测试工程师 目标网站 CloudForum 企业内部论坛 (forum.cloudcorp.example.com) 委托方 CloudCorp IT 部门 — 管理员发现留言板出现奇怪弹窗,所有访问者都中招 任务目标 验证留言板是否存在存储型 XSS 漏洞,注入持久化 payload

◈ 教程:什么是存储型 XSS?

原理

存储型 XSS(Stored XSS)是最危险的 XSS 类型。攻击者的 payload 被永久存储在目标服务器上(数据库、文件、Session 等), 每个访问受影响页面的用户都会自动执行恶意代码。

关键特征:持久化。payload 存储在服务器端,无需诱导用户点击特定链接,任何访问者都会中招。

与反射型 XSS 的区别

  • 反射型:payload 在 URL 中,需要用户点击恶意链接
  • 存储型:payload 存在服务器上,用户正常访问即触发
  • 危害范围:存储型影响所有访问者,反射型只影响点击链接的人

攻击流程

  • 攻击者在留言板/评论区提交包含恶意代码的内容
  • 服务器将恶意内容存储到数据库/文件
  • 其他用户访问该页面,服务器返回包含恶意代码的 HTML
  • 浏览器解析 HTML,执行嵌入的 JavaScript

漏洞代码分析

<?php
// 存储用户消息
$_SESSION['messages'][] = [
    'name'    => $_POST['name'],
    'message' => $_POST['message']  // 原样存储
];

// 输出消息 — 漏洞所在
foreach ($_SESSION['messages'] as $msg) {
    // 危险:直接输出,未使用 htmlspecialchars()
    echo $msg['message'];
}
?>

常见攻击场景

  • 论坛/留言板评论注入
  • 用户资料(昵称、签名、简介)注入
  • Web 邮件系统邮件内容注入
  • CMS 后台内容注入

◈ 练习:触发存储型 XSS

目标:CloudForum 企业内部论坛 (forum.cloudcorp.example.com) 的留言板功能。你提交的消息会被保存并展示给所有访问者。你的任务是在留言中注入 JavaScript 代码。
清空所有留言
留言板(所有留言对每个访问者可见):

暂无留言,成为第一个留言的人吧...
过滤状态:无任何过滤 — 名字和留言内容被原样存储并输出到 HTML
查看漏洞源码 (PHP)
<?php session_start(); // 存储消息到 session 数组 if ($_POST['name'] && $_POST['message']) { $_SESSION['messages'][] = [ 'name' => $_POST['name'], 'message' => $_POST['message'], 'time' => date('H:i:s') ]; } // 输出所有消息 — 危险:直接输出,无任何转义 foreach ($_SESSION['messages'] as $msg) { echo "<div class=\"msg\">"; echo "<strong>" . $msg['name'] . "</strong>: "; echo $msg['message']; // 漏洞:未转义 echo "</div>"; } ?>