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

相关推荐
持敬chijing1 天前
Web渗透之SQL注入-堆叠注入(Stacked Queries Injection)
sql·安全·web安全·网络安全·网络攻击模型·安全威胁分析
vortex51 天前
CheatMD:让 Markdown 笔记变成可执行的交互式命令
笔记·网络安全·markdown
txg6661 天前
网络安全领域简报(2026年5月31日—6月7日)
安全·web安全·网络安全
持敬chijing1 天前
Web渗透之SQL注入-宽字节注入
sql·安全·web安全·网络安全·网络攻击模型·安全威胁分析·web
汤愈韬2 天前
IPSec-NAT穿越原理和配置
网络·网络协议·安全·网络安全·security
大方子2 天前
【PolarCTF】导航栏
网络安全·polarctf
网络研究院2 天前
中国网络安全与数据保护领域政策与执法动态回顾(2026年4月)
网络安全·数据保护·执法·政策·回顾
网络研究院2 天前
中国网络安全与数据保护领域政策与执法动态回顾(2026年2月)
网络安全·数据保护·法规·政策·回顾
humors2212 天前
四种字母密码表示法
安全·网络安全·密码学
XINVRY-FPGA2 天前
XCKU035-2FBVA676I AMD Xilinx Kintex UltraScale FPGA
arm开发·嵌入式硬件·网络安全·fpga开发·硬件工程·信号处理·fpga