文件上传复现

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文件并执行任意命令‌

相关推荐
我命由我123457 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
A富得流油的咸鸭蛋7 小时前
安卓鸿蒙面试
android·面试·harmonyos
Coffeeee7 小时前
AGP9.0的主要变更项,给Gradle来一次大变样
android·前端·gradle
小孔龙8 小时前
Android GPU 渲染管线:一帧画面如何走上屏幕
android·性能优化·gpu
恋猫de小郭8 小时前
KotlinLLM 开源 ,一个可以在运行时自己生成永久 Kotlin 代码的 Agent 库
android·前端·人工智能
游戏开发爱好者88 小时前
iOS应用加固方案全解析:源码加固与IPA在线加固对比
android·macos·ios·小程序·uni-app·cocoa·iphone
大鹏说大话8 小时前
PHP 异步处理方案:队列使用场景与 RabbitMQ 实操
android
molihuan9 小时前
最新 Paddle-Lite Android平台编译
android·ocr·paddle·推理·端侧·paddle lite
小肝一下9 小时前
多态(上)
android·开发语言·c++·vscode·多态·面向对象·伊蕾娜
三少爷的鞋9 小时前
Android 面试系列:Retrofit 的 suspend 是如何实现的?
android