cysec-don/XSS

GitHub: cysec-don/XSS

一款专为安全教学设计的 XSS 漏洞靶场,提供反射型、存储型和 DOM 型 XSS 的实操练习与渐进式挑战环境。

Stars: 0 | Forks: 0

# VulnLab - XSS 练习场 **作者:** Cysec Don ([cysecdon@gmail.com](mailto:cysecdon@gmail.com)) ## ⚠️ 免责声明 **本应用是故意设计为存在漏洞的。** 它仅用于教育目的。请勿将此应用部署在公网面向外部的服务器或任何未经授权用户可以访问的网络中。运行此应用程序会使您的系统面临 XSS 攻击风险。仅在隔离的本地环境中用于安全培训和 研究。 使用本软件即表示您对任何损坏或滥用承担全部责任。作者对使用本应用程序进行的任何非法或未经授权的活动概不负责。 ## 概述 VulnLab 是一个极简、设计美观的 Web 应用程序,其中包含多个故意的 XSS 漏洞。它提供了一个安全、可控的环境,让安全爱好者、开发者和学生能够: - 练习识别和利用反射型、存储型和基于 DOM 的 XSS - 了解不安全的编码实践如何导致真实的漏洞 - 测试过滤器绕过技术和 payload 工程 - 理解通过 XSS 进行的权限提升 - 与 BeEF (Browser Exploitation Framework) 集成以进行高级练习 该应用使用 **Node.js** 和 **Express** 构建,前端使用原生 HTML/CSS/JavaScript。没有框架,没有抽象——只有你可以看到、理解和利用的原始、存在漏洞的代码。 ## 快速开始 ### 选项 1: Docker (推荐) 最简单的入门方法。Docker 确保了一个干净、隔离的环境。 ``` # Clone 仓库 git clone https://github.com/cysec-don/XSS.git cd XSS # 使用 Docker Compose 构建并运行 docker compose up -d # Lab 现在运行在 http://localhost:3001 ``` 停止实验室: ``` docker compose down ``` 查看日志: ``` docker compose logs -f ``` 在进行更改后重新构建: ``` docker compose build --no-cache docker compose up -d ``` ### 选项 2: Docker (手动构建) ``` # 构建 Docker 镜像 docker build -t vulnlab-xss . # 运行容器 docker run -d -p 3001:3001 --name vulnlab vulnlab-xss # Lab 现在运行在 http://localhost:3001 ``` 停止: ``` docker stop vulnlab docker rm vulnlab ``` ### 选项 3: Node.js (本地) ``` # Clone 仓库 git clone https://github.com/cysec-don/XSS.git cd XSS # 安装依赖 npm install # 启动服务器 npm start # Lab 现在运行在 http://localhost:3001 ``` ## 应用程序结构 ``` XSS/ ├── server.js # Express server with vulnerable routes ├── package.json # Node.js project configuration ├── public/ │ └── css/ │ └── style.css # Application stylesheet (dark theme) ├── Dockerfile # Docker build configuration ├── docker-compose.yml # Docker Compose for easy deployment ├── .dockerignore # Docker build exclusions ├── .gitignore # Git exclusions └── README.md # This file ``` ## 存在漏洞的页面 ### 1. 搜索页面 (反射型 XSS) **URL:** `http://localhost:3001/` 搜索页面将 `q` 查询参数直接反映在 HTML 响应中,没有任何编码或过滤。这是经典的反射型 XSS 场景。 **如何利用:** ``` http://localhost:3001/?q= ``` **漏洞点:** `query` 值使用模板字符串插入到搜索输入框的 `value` 属性和结果标题中,且未进行转义。 ### 2. 评论页面 (存储型 XSS) **URL:** `http://localhost:3001/comments` 用户可以发布带有作者姓名和文本的评论。这两个字段都存储在内存中,并在没有任何 HTML 编码的情况下显示给所有访问者。这是一个经典的存储型 XSS 漏洞。 **如何利用:** 使用以下任何 payload 发布评论: | Payload | 描述 | |---------|-------------| | `` | 基本的 script 标签 | | `` | Image onerror 处理程序 | | `` | SVG 元素 | | `
` | Details 元素 | **漏洞点:** `comment.author` 和 `comment.text` 的值在未经转义的情况下直接拼接到 HTML 响应中。 ### 3. 个人资料页面 (存储型 + 基于 DOM 的 XSS) **URL:** `http://localhost:3001/profile/user1` 或 `http://localhost:3001/profile/admin` 个人资料页面包含 **两个** 漏洞: **a) 通过 Bio 字段的存储型 XSS:** 用户可以通过编辑表单更新他们的个人简介。简介内容未经编码即被存储和渲染。 **如何利用:** 使用以下内容更新 bio 字段:`` **b) 通过 URL Hash 的基于 DOM 的 XSS:** 页面包含读取 `window.location.hash` 并将其设置为某个 div 元素的 `innerHTML` 的 JavaScript。Hash 片段永远不会发送到服务器,这使得服务器端防御无法检测到此攻击。 **如何利用:** ``` http://localhost:3001/profile/user1#
``` **漏洞点:** - `profile.bio` 的值在未经转义的情况下被插入到 HTML 中 - 客户端 JavaScript 读取 `window.location.hash` (源) 并将其赋值给 `innerHTML` (汇) ### 4. 管理后台 (权限提升) **URL:** `http://localhost:3001/admin` 管理后台显示所有未编码的用户评论,并包含一个带有秘密管理员 token (`ADMIN_SECRET_TOKEN_xyz789`) 的隐藏元素。这意味着通过评论页面注入的存储型 XSS payload 将在管理员浏览器的上下文中执行。 **如何利用(组合攻击):** 1. 发布包含以下内容的评论:`` 2. 当管理员访问管理后台时,脚本将执行并窃取秘密 token **漏洞点:** 管理后台中渲染的评论使用了与评论页面相同的未转义输出,此外隐藏的 token 可由页面上运行的任何 JavaScript 访问。 ### 5. API 端点 (JSON XSS) **URL:** `http://localhost:3001/api/search?q=test` API 端点返回嵌有查询参数的 JSON。虽然 JSON 响应通常是安全的,但配置错误的 Content-Type 头可能会导致内容嗅探攻击。 ## 实验室练习 ### 练习 1: 反射型 XSS — 窃取 Cookie **目标:** 构造一个在其他用户访问时窃取会话 cookie 的 URL。 **提示:** 1. 搜索查询直接插入到 HTML 响应中 2. 你需要一个能读取 `document.cookie` 的 script 标签或事件处理程序 3. 使用 `Image()` 技巧或 `fetch()` 在没有 CORS 问题的情况下提取数据 **解决方案:** ``` http://localhost:3001/?q= ``` ### 练习 2: 存储型 XSS — 持久化攻击 **目标:** 发布一条在任何用户查看评论页面时执行 JavaScript 的评论。 **提示:** 1. 评论文本字段未经清理即接受任何内容 2. Script 标签有效,但为了多样化,请尝试使用带有 `onerror` 的 `img` 标签 3. payload 在页面加载后持续存在,并影响每个访问者 **解决方案:** 发布带有以下文本的评论:`` ### 练习 3: 基于 DOM 的 XSS — Hash 注入 **目标:** 利用个人资料页面上的基于 DOM 的 XSS,在没有任何服务器交互的情况下执行 JavaScript。 **提示:** 1. 个人资料页面上的 JavaScript 读取 `window.location.hash` 并设置 `innerHTML` 2. Hash 片段从不发送到服务器,因此服务器端防御无法检测到它 3. 你需要一个带有事件处理程序的 HTML 元素,例如 `img onerror` **解决方案:** ``` http://localhost:3001/profile/user1# ``` ### 练习 4: 通过存储型 XSS 进行权限提升 **目标:** 作为普通用户,发布一条从管理后台窃取管理员秘密 token 的评论。 **提示:** 1. 管理后台未经编码显示评论,并包含一个带有秘密 token 的隐藏 `div` 2. 你的 payload 需要读取 `#admin-secret` 元素的内容 3. 使用 `document.getElementById("admin-secret").textContent` 读取 token **解决方案:** 发布带有以下文本的评论: ``` ``` ### 练习 5: BeEF 集成 — 浏览器 Hook **目标:** 使用 BeEF Hook VulnLab 应用程序并演示后渗透能力。 **前置条件:** 在你的机器上安装并运行 [BeEF](https://beefproject.com/)。 **提示:** 1. 启动 BeEF 并记下 hook URL (默认: `http://YOUR_IP:3000/hook.js`) 2. 使用存储型 XSS 注入 hook 脚本,使其跨会话持久存在 3. 一旦浏览器被 Hook,使用 BeEF 模块收集信息 **解决方案:** 发布包含以下内容的评论: ``` ``` 或使用事件处理程序 (绕过简单的 script 标签过滤器): ``` ``` ## 挑战模式 准备好接受真正的挑战了吗?这些场景增加了你必须绕过的防御措施: ### 挑战 1: 被过滤的输入 修改搜索页面,添加一个阻止单词 "script" (不区分大小写) 的简单服务器端过滤器。你的任务是绕过此过滤器并实现 XSS。 **绕过技术:** - 替代标签: ``, ``, `
`, `
` - 替代事件处理程序: `onerror`, `onload`, `ontoggle`, `onfocus` - 编码技巧: HTML 实体,Unicode 转义 ### 挑战 2: 启用 CSP 向应用程序添加以下 CSP 头: ``` Content-Security-Policy: script-src 'self' https://trusted-cdn.com ``` 你的任务是绕过此 CSP 并实现 XSS。提示:在受信任的 CDN 域上查找 JSONP 端点,或尝试注入 `` 标签以重定向相对脚本源。 ### 挑战 3: 部分过滤 修改评论处理程序以剥离 `` | | 评论页 (存储型) | `` | | 个人资料页 (DOM) | `http://localhost:3001/profile/user1#` | ### BeEF 练习 - **练习 A:** 通过反射型 XSS Hook — 构造一个加载 BeEF hook 的 URL - **练习 B:** 通过存储型 XSS Hook — 发布一条 Hook 每个访问者的评论 - **练习 C:** 社会工程学 — 使用 "Pretty Theft" 和 "Fake Flash Update" 模块 - **练习 D:** 网络侦察 — 使用 BeEF 的端口扫描和 Ping 扫描模块 ## 技术细节 ### 默认端口 | 服务 | 端口 | |---------|------| | VulnLab | 3001 | | BeEF (可选) | 3000 | ### 数据存储 VulnLab 使用内存数据存储。所有数据 (评论、个人资料) 在服务器重启时重置。这是故意的——它保持实验室干净,并防止持久的恶意 payload 在会话之间存活。 ### 安全头 (故意缺失) 应用程序未设置以下安全头,而这些头通常可以防止或减轻 XSS 攻击: - `Content-Security-Policy` — 会限制脚本源 - `X-Content-Type-Options` — 会阻止内容类型嗅探 - `X-XSS-Protection` — 会启用浏览器 XSS 过滤器 (已弃用,但具有参考价值) - 带有 `HttpOnly` 的 `Set-Cookie` — 会阻止通过 JavaScript 访问 cookie ## 故障排除 ### 端口已被占用 如果端口 3001 已被占用,你可以更改它: **Docker:** ``` # 更改 docker-compose.yml 中的端口映射或使用: docker run -d -p 8080:3001 --name vulnlab vulnlab-xss ``` **Node.js:** ``` PORT=8080 npm start ``` ### Docker 容器无法启动 ``` # 查看日志 docker compose logs vulnlab # 从头开始 Rebuild docker compose build --no-cache docker compose up -d ``` ### CSS 未加载 确保 `public/css/` 目录结构完整,并且 `server.js` 中的静态文件中间件配置正确。 ## 许可证 MIT 许可证 — 详见 [LICENSE](LICENSE)。 ## 作者 **Cysec Don** Email: [cysecdon@gmail.com](mailto:cysecdon@gmail.com) GitHub: [https://github.com/cysec-don](https://github.com/cysec-don) *记住:能力越大,责任越大。请在合法和道德的范围内使用你的技能。*
标签:BeEF, CISA项目, CMS安全, CSS, CTF训练, Docker, DOM型XSS, Express, GNU通用公共许可证, Go语言工具, HTML, JavaScript, MITM代理, Node.js, Web安全, XML 请求, XSS, 代码安全, 反射型XSS, 多模态安全, 存储型XSS, 安全开发, 安全测试, 安全练习, 安全防御评估, 攻击性安全, 故意漏洞, 数据可视化, 漏洞修复, 漏洞情报, 漏洞枚举, 漏洞靶场, 爬虫, 网络安全, 网络安全培训, 网络安全实验, 自定义脚本, 蓝队分析, 请求拦截, 跨站脚本攻击, 防御检测, 隐私保护