一款功能完整的 XSS 漏洞扫描器,支持反射型、存储型、DOM 型 XSS 检测,具备动态爬虫、上下文感知 Payload、并发扫描、中断恢复、多格式报告等高级特性。
- 动态爬虫:基于 Playwright,支持 JavaScript 渲染、SPA 页面、动态链接提取。
- 三种 XSS 检测:
- 反射型:GET 参数、表单(含
multipart/form-data) - 存储型:提交后多页面验证,自动清理测试数据
- DOM 型:Hook 常见 Sink(
innerHTML,eval,setTimeout等),测试多种 Source(hash,search)
- 反射型:GET 参数、表单(含
- 浏览器执行验证:可用 Playwright 验证 payload 是否真实执行,将结果区分为“已确认执行 / 已确认反射 / 疑似”。
- 自动截图取证:确认执行时保存浏览器截图,HTML 报告中直接展示证据。
- 一键演示靶场:
--demo会启动本地漏洞页面并自动扫描,适合演示和回归测试。 - 生产安全模式:
--production-safe会启用只读扫描、危险路径拦截、Host 白名单、请求预算和扫描前授权确认。 - 上下文感知:自动识别 Payload 注入位置(HTML、属性、JS),选择精准 Payload。
- 智能 Payload 库:包含大小写绕过、HTML 实体、Unicode 编码等变种。
- 高效扫描:支持并发线程、断点续扫(
Ctrl+C保存进度)。 - 证据化报告:CSV + JSON + HTML + SARIF,包含漏洞类型、状态、置信度、证据片段、浏览器证据、截图和修复建议。
- 灵活配置:超时、深度、代理、User-Agent、Cookie/Header 导入。
git clone https://github.com/AukSoryu/xss_scanner.git
cd xss_scannerpip install -r requirements.txt
playwright install chromium如果只需要静态 HTML 扫描,可以不安装 Chromium,并在运行时加 --no-browser。
也可以安装为命令行工具:
pip install -e .
xss-scanner --help编辑 config.py 可调整以下参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
TIMEOUT |
10 | HTTP 请求超时(秒) |
RETRY_TIMES |
2 | 请求重试次数 |
MAX_DEPTH |
2 | 爬虫最大深度 |
MAX_URLS |
100 | 最大爬取页面数 |
THREADS |
4 | 并发扫描线程数 |
HEADLESS |
True | 浏览器无头模式(设为 False 可观察浏览器动作) |
VERIFY_SSL |
True | 是否校验 HTTPS 证书 |
ENABLE_STORED |
False | 是否启用存储型检测 |
ENABLE_VERIFY |
False | 是否启用浏览器执行验证 |
SAVE_SCREENSHOTS |
True | 确认执行时是否保存截图 |
PRODUCTION_MODE |
False | 是否启用生产安全策略 |
READ_ONLY |
True | 是否阻止非 GET 表单提交 |
REQUEST_BUDGET |
500 | 单次扫描最多请求数 |
PROXY |
None |
HTTP/HTTPS 代理(支持环境变量 HTTP_PROXY) |
USER_AGENTS |
[...] | 随机 User-Agent 列表 |
LOG_LEVEL |
"INFO" |
日志级别 |
OUTPUT_FORMAT |
"csv,json,html,sarif" |
报告输出格式 |
配置也可以通过环境变量覆盖,例如:
export HTTP_PROXY=http://127.0.0.1:8080
export XSS_TIMEOUT=5
export XSS_THREADS=2python main.py http://testphp.vulnweb.compython main.py --demo这个命令会启动本地演示靶场、自动扫描、用浏览器确认执行,并在 results/ 下生成 HTML/JSON/CSV/SARIF 报告。打开 HTML 报告可以看到确认状态、截图证据、搜索筛选和复制按钮。
# 不启动浏览器,只做静态爬取和反射型检测
python main.py http://example.com --no-browser
# 只扫反射型,并用浏览器验证是否真实执行
python main.py http://example.com --mode reflected --verify-browser
# 控制并发、超时、爬取深度和输出目录
python main.py http://example.com --threads 2 --timeout 5 --max-depth 1 --results-dir results --output-format json,html,sarif
# 启用存储型检测(会向目标表单提交测试数据,请确认授权和测试环境)
python main.py http://example.com --enable-stored生产或准生产环境建议先使用只读安全模式:
python main.py https://app.example.com \
--production-safe \
--yes \
--mode reflected \
--verify-browser \
--allowed-host app.example.com \
--include-path "/app/*" \
--exclude-path "/logout*" \
--exclude-path "/billing/*" \
--exclude-path "/admin/*" \
--request-budget 120 \
--threads 1 \
--delay 1 \
--max-depth 1 \
--max-urls 30 \
--output-format json,html,sarif参数含义:
--production-safe:启用生产安全模式,默认只读,不提交 POST 表单。--allowed-host:限制只扫描指定 Host,防止爬虫跑到第三方域名。--include-path/--exclude-path:控制扫描路径范围。--request-budget:限制最多请求数。--yes:跳过交互确认,适合 CI;手动扫描时可以不加。
# 字符串形式
python main.py http://example.com --cookie "sessionid=abc123; user=admin"
# 从文件读取(每行 name=value)
python main.py http://example.com --cookie cookies.txt# headers.json 内容:{"Authorization": "Bearer token", "X-Custom": "value"}
python main.py http://example.com --headers headers.json- 按
Ctrl+C会保存当前进度到results/目录。 - 再次运行相同目标 URL 会自动恢复进度,继续扫描未完成的页面。
- 扫描完成后进度文件自动删除。
扫描结束后在 results/ 目录下生成报告文件:
主机名_时间戳.csv:表格形式,适合快速查看和导入表格工具。主机名_时间戳.json:完整结构化数据,包含 evidence,便于二次处理。主机名_时间戳.html:可直接打开的交互式证据报告,展示状态、置信度、截图、证据片段和修复建议。主机名_时间戳.sarif:SARIF 2.1.0 报告,可用于 GitHub Code Scanning 等平台。evidence/*.png:浏览器确认执行时保存的截图证据。
- 爬虫:使用 Playwright 访问目标,提取所有同域链接(含 JS 动态生成)。
- 参数提取:从每个页面的 URL 查询参数和表单中识别注入点。
- 上下文探测:发送探针 Payload(如
<XSSPROBE123>),分析返回内容确定注入点所处的上下文(HTML / 属性 / JS)。 - 精准攻击:根据上下文选择对应的 Payload 列表,逐个测试并观察是否反射。
- 浏览器验证:启用
--verify-browser后,使用无害的console.log验证 payload 是否真实执行。 - 存储型验证:提交 Payload 后,遍历所有已发现页面,轮询等待出现,防止异步存储。
- DOM 型检测:通过浏览器 Hook 监控 Sink 函数,注入包含
location.hash/search的 Payload,检查是否有数据流入危险 Sink。
- 添加新 Payload:在
payloads/对应的*_payloads.py文件列表中追加即可。 - 添加新上下文:修改
detectors/context.py中的detect_context函数。 - 添加新 Sink Hook:编辑
browser/sink_hook.js,在sinkProps数组中增加属性名或函数名。
-
扫描目标需获得授权,仅用于合法安全测试。
严禁 用于任何未经授权的扫描、攻击或数据窃取行为。
使用本工具即表示你已阅读、理解并同意 完整免责声明 中的所有条款。 任何违法违规行为由使用者自行承担全部法律责任,开发者不承担任何连带责任。
-
高并发(
THREADS较大)可能对目标服务器造成压力,请谨慎设置。 -
存储型检测会在目标数据库中插入测试数据(如
XSSPROBE123),默认关闭;需要时使用--enable-stored,并建议仅在测试环境使用。 -
生产环境建议始终使用
--production-safe,先只扫反射型:--mode reflected。 -
默认会拦截包含
logout/delete/remove/pay/password/admin等关键词的 URL 和字段名。 -
浏览器执行验证使用本地无害 marker,不会主动向外部域名发送回调请求。
-
默认校验 HTTPS 证书;若需扫描证书无效的授权站点,可使用
--no-verify-ssl或设置XSS_VERIFY_SSL=false。
本项目采用 MIT License 开源。
-
作者:AukSoryu · https://github.com/AukSoryu
-
学习交流 :欢迎大佬带带刚入行的小白
-
开源精神:欢迎 Star、Fork、提 Issue 或 PR,一起让这个工具更安全、更强大。
⭐ 如果你觉得这个项目有帮助,请给它一个 Star —— 这是对作者最大的鼓励!
