9-::$DATA后缀绕过$is_uploadfalse;$msgnull;if(isset($_POST[submit])){if(file_exists(UPLOAD_PATH)){$deny_extarray(.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_nametrim($_FILES[upload_file][name]);$file_namedeldot($file_name);//删除文件名末尾的点$file_extstrrchr($file_name,.);$file_extstrtolower($file_ext);//转换为小写$file_exttrim($file_ext);//首尾去空if(!in_array($file_ext,$deny_ext)){$temp_file$_FILES[upload_file][tmp_name];$img_pathUPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_uploadtrue;}else{$msg上传出错;}}else{$msg此文件类型不允许上传;}}else{$msgUPLOAD_PATH.文件夹不存在,请手工创建;}}没有过滤::$DATA​::$DATA​ 是Windows NTFS 文件系统的备用数据流Alternate Data Stream, ADS的语法。当一个文件名末尾加上::$DATA​ 时Windows 会强制将其解释为​主数据流​即普通文件内容而忽略::$DATA自身。​绕过原理​上传时如果程序只对$_FILES[upload_file][name]​ 进行简单的黑名单后缀检查比如检测是否以.php​ 结尾那么你可以在文件名后面加上::$DATA例如textshell.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 系统访问文件被攻击者利用来绕过简单的上传检测。‍