文件上传复现

1.PHPCMS

PHPCMS 头像上传功能允许用户上传 ZIP 压缩包,系统自动解压并删除非图片文件(如 .php.txt),利用解压后文件保留机制上传至服务器‌,使用特殊符号混淆文件名(如 shell.txt?.php#.jpg),使系统误判为图片文件‌但未严格校验文件真实类型及内容,导致攻击者可构造特殊压缩包绕过删除逻辑,保留恶意文件‌

复制代码
// 1. 接收用户上传的 ZIP 压缩包并直接写入临时文件  
file_put_contents($filename, $this->avatardata);  
​
// 2. 使用 PclZip 解压压缩包  
$archive = new PclZip($filename);  
$archive->extract(PCLZIP_OPT_PATH, $dir);  
​
// 3. 遍历解压后的目录,删除非图片文件  
function check_dir($dir) {  
    $handle = opendir($dir);  
    while (($f = readdir($handle)) !== false) {  
        if (!in_array($f, array('.', '..'))) {  
            $ext = strtolower(substr(strrchr($f, '.'), 1));  // 获取文件扩展名  
            if (!in_array($ext, array('jpg', 'gif', 'png'))) {  
                @unlink("$dir/$f");  // 删除非图片文件  
            }  
        }  
    }  
}  

漏洞点分析

仅通过 $ext 判断文件类型(如 .php.txt),未校验文件内容或真实 MIME 类型‌12。

攻击者可通过畸形文件名(如 shell.php#.jpg)绕过过滤‌35。

‌删除操作仅针对扩展名,未处理文件名中的特殊字符(如 ?.php)‌

2.FineCMS

复制代码
// 解压后递归删除非图片文件(修复 ZIP 解压逻辑)  
function safe_extract($dir) {  
    $files = glob("$dir/*");  
    foreach ($files as $file) {  
        if (is_dir($file)) {  
            safe_extract($file);  // 递归处理子目录•:ml-citation{ref="1,2" data="citationList"}  
        } else {  
            $mime = mime_content_type($file);  // 获取真实 MIME 类型  
            if (!in_array($mime, ['image/jpeg', 'image/png'])) {  
                @unlink($file);  // 立即删除非法文件•:ml-citation{ref="1,2" data="citationList"}  
            } else {  
                $new_name = md5(uniqid()) . '.jpg';  // 随机哈希命名  
                rename($file, "$dir/$new_name");  // 重命名防止路径预测•:ml-citation{ref="2,3" data="citationList"}  
            }  
        }  
    }  
}  

原理:

攻击者通过多线程脚本在服务器释放文件锁的瞬间发起高频请求,访问未完成重命名的临时文件‌。

若服务器处理延迟或锁机制存在短暂失效,恶意文件可能短暂暴露并执行‌

可以利用burp进行抓包,然后通过不停发包与刷新,访问php文件,使其在上级或其他级目录生成恶意代码

3.利用随机数生成目录名漏洞

当系统将用户上传的压缩包解压到随机目录时,若解压过程因文件格式错误、恶意构造的压缩包等原因失败,服务端可能未彻底清理已创建的随机目录或部分解压文件。攻击者可利用此缺陷,通过多次上传恶意压缩包,使服务器保留残留的Webshell文件(如.php.jsp),最终通过路径爆破或结合其他漏洞(如文件包含)执行恶意代码‌

构造一个包含Webshell的ZIP文件,其中混杂损坏的压缩数据,触发服务端解压异常

服务端解压失败后,未删除已创建的随机目录及部分解压出的Webshell文件

定位残留的Webshell文件并执行任意命令‌

相关推荐
潘潘潘12 分钟前
Android多线程机制简介
android
CYRUS_STUDIO2 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO2 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴6 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我6 小时前
flutter 之真手势冲突处理
android·flutter
法的空间6 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止6 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭7 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech7 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831677 小时前
为何Handler的postDelayed不适合精准定时任务?
android