9-::$DATA后缀绕过

9-::$DATA后缀绕过

php 复制代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

没有过滤::$DATA

​::$DATA​ 是 Windows NTFS 文件系统的备用数据流(Alternate Data Stream, ADS) 的语法。当一个文件名末尾加上 ::$DATA​ 时,Windows 会强制将其解释为​主数据流 ​(即普通文件内容),而忽略 ::$DATA 自身。

​绕过原理 ​:

上传时,如果程序只对 $_FILES['upload_file']['name']​ 进行简单的黑名单后缀检查,比如检测是否以 .php​ 结尾,那么你可以在文件名后面加上 ::$DATA,例如:

text

复制代码
shell.php::$DATA
  • 程序检测到的后缀可能是 .php::$DATA(如果直接取扩展名),黑名单里通常没有这个后缀,因此通过检查。
  • 当文件被 move_uploaded_file() 移动到 Windows 目标目录时,系统会忽略 ​::$DATA​ ,实际保存的文件名变成 shell.php。
  • 最终得到可解析的 PHP 文件,从而完成上传绕过。

如果代码中有 str_ireplace('::$DATA', '', $file_ext) 这样的过滤,这个绕过方法就会失效(例如你的第七关代码已经过滤了)。


为什么上传到 Windows 上之后,后面的 ::$DATA 不见了?

因为 ::$DATA​ 是 Windows 底层文件系统(NTFS)的一个​特殊标识符,不是文件名的一部分。当系统创建文件时:

  • 解析路径:shell.php::$DATA → 表示"文件 shell.php 的主数据流"。
  • 最终文件系统只保存文件名 shell.php,而不保留 ::$DATA 字符。

所以在文件夹中看到的是 shell.php​,而不是带有 ::$DATA 的奇怪名字。

这个特性原本用于兼容性(比如从非 NTFS 系统访问文件),被攻击者利用来绕过简单的上传检测。

‍

相关推荐
Daorigin_com4 小时前
道本科技携手DeepSeek:以AI重塑合同全生命周期管理
前端·人工智能·科技·网络安全·数据挖掘·前端框架·传媒
白帽攻防录4 小时前
SRC 挖洞:Apache Tomcat 加密拦截器绕过深度复盘,CVE-2026-34486 fail-open 一行代码怎么打穿集群通信
java·网络安全·tomcat·apache
学逆向的5 小时前
win32消息类型
windows·网络安全·mfc·api·win32
白帽攻防录6 小时前
SRC 挖洞:GitLab GraphQL 指令绕过深度复盘,CVE-2026-19478 未授权删项目怎么打穿代码托管平台
网络·网络安全·gitlab·graphql
Johny_Zhao15 小时前
FreeRADIUS + 华为AC/AP + 802.1X/WPA2-Enterprise 无线认证对接部署完整指南
网络·网络安全·信息安全·ldap·radius·huawei·系统运维·centos8
锐速网络18 小时前
轻量化安全建设指南:无需硬件的SaaS化勒索病毒防御方案
网络安全·云备份·主机安全·saas安全·勒索病毒防护·轻量化安全·中小企业安全
小小小小钰儿20 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
持敬chijing1 天前
CTFshow-WEB-新年好?解题思路
安全·web安全·网络安全·网络攻击模型
兢谨网安1 天前
Web应用渗透测试方案
网络·网络安全
XLYcmy1 天前
基于图神经网络的物联网固件漏洞静态挖掘技术方案 上
神经网络·物联网·网络安全·二进制·elf·漏洞检测·固件