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 系统访问文件),被攻击者利用来绕过简单的上传检测。

相关推荐
马立杰20 小时前
IE241216_准入认证技术
安全·网络安全·交换安全
白猫不黑21 小时前
AI时代如何利用AI学好网络安全
人工智能·安全·web安全·计算机·网络安全·信息安全
佳&弥1 天前
后渗透痕迹清理
服务器·windows·web安全·网络安全
2501_915921431 天前
抓包工具对比:Charles、TraceEagle、Wireshark、Fiddler 与 Proxyman
网络协议·计算机网络·网络安全·ios·adb·https·udp
Shi-p1 天前
实战|分布式诱捕威胁情报 TrapCloud,无需本地部署,实现公网攻击源主动封堵
网络安全·威胁分析
Johny_Zhao1 天前
网络安全等级保护测评实施方案
linux·网络·人工智能·网络安全·信息安全·云计算·等保测评·系统运维·itsm
菩提小狗1 天前
每日安全情报报告 · 2026-09-06
网络安全·漏洞·cve·安全情报·每日安全
HackTwoHub2 天前
BurpSuite2026.8专业(稳定版)下载Windows/Linux/Mac支持Java21以上(新增Burp AT智能体)
linux·运维·服务器·安全·macos·网络安全·自动化
Chockmans2 天前
SRC---信息收集(灯塔自动化推荐)
网络安全
数据知道2 天前
YARA 规则编写实战——从样本到检测规则
网络·安全·网络安全