Emlog漏洞————敏感資訊洩露

FLy_鵬程萬里發表於2018-06-05

Emlog簡介

Emlog是“Every Memory Log”的簡介,意即:點滴記憶。它是一款基於PHP語言哈MYSQL資料庫的開源、免費、功能強大的個人或多人聯合撰寫的部落格系統(Blog)。基於PHP和MYSQL的功能強大的部落格以及CMS建站系統。致力於提供快速、穩定,且在使用上又及其簡單、舒適的部落格服務。安裝和使用都非常方便。目前Emlog正在受到越來越多的廣大使用者的青睞。

漏洞分析

影響版本:Emlog<=5.3
利用條件:登入後臺
漏洞描述:

本次漏洞出現的位置位於:emlog\src\admin\index.php中的第92-95行

<?php
/**
 * 管理中心
 * @copyright (c) Emlog All Rights Reserved
 */

require_once 'globals.php';

if ($action == '') {
	$avatar = empty($user_cache[UID]['avatar']) ? './views/images/avatar.jpg' : '../' . $user_cache[UID]['avatar'];
	$name =  $user_cache[UID]['name'];

	$serverapp = $_SERVER['SERVER_SOFTWARE'];
	$DB = Database::getInstance();
	$mysql_ver = $DB->getMysqlVersion();
	$php_ver = PHP_VERSION;
	$uploadfile_maxsize = ini_get('upload_max_filesize');
	$safe_mode = ini_get('safe_mode');

	if (function_exists("imagecreate")) {
		if (function_exists('gd_info')) {
			$ver_info = gd_info();
			$gd_ver = $ver_info['GD Version'];
		} else{
			$gd_ver = '支援';
		}
	} else{
		$gd_ver = '不支援';
	}

	include View::getView('header');
	require_once(View::getView('index'));
	include View::getView('footer');
	View::output();
}
if ($action == 'update' && ROLE == ROLE_ADMIN) {
	$source = isset($_GET['source']) ? trim($_GET['source']) : '';
	$upsql = isset($_GET['upsql']) ? trim($_GET['upsql']) : '';

	if (empty($source)) {
		exit('error');
	}

	$temp_file = emFecthFile(OFFICIAL_SERVICE_HOST . $source);
	if (!$temp_file) {
		 exit('error_down');
	}

	$ret = emUnZip($temp_file, '../', 'update');
	@unlink($temp_file);

	switch ($ret) {
		case 1:
		case 2:
			exit('error_dir');
			break;
		case 3:
			exit('error_zip');
			break;
	}

	//update db
	if(!$upsql) {
		exit('succ');
	}
	$DB = Database::getInstance();
	$setchar = $DB->getMysqlVersion() > '4.1' ? "ALTER DATABASE `" . DB_NAME . "` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" : '';
	$temp_file = emFecthFile(OFFICIAL_SERVICE_HOST . $upsql);
	if (!$temp_file) {
		 exit('error_down');
	}
	$sql = file($temp_file);
	@unlink($temp_file);
	array_unshift($sql,$setchar);
	$query = '';
	foreach ($sql as $value) {
		if (!$value || $value[0]=='#') {
			continue;
		}
		$value = str_replace("{db_prefix}", DB_PREFIX, trim($value));
		if (preg_match("/\;$/i", $value)) {
			$query .= $value;
			$DB->query($query);
			$query = '';
		} else{
			$query .= $value;
		}
	}
	$CACHE->updateCache();
	exit('succ');
}
//phpinfo()
if ($action == 'phpinfo') {
	@phpinfo() OR emMsg("phpinfo函式被禁用!");
}

也就是上面程式碼的最後一部分:

 

//phpinfo()
if ($action == 'phpinfo') {
	@phpinfo() OR emMsg("phpinfo函式被禁用!");
}

根據以上程式碼我們知曉只要我們以普通使用者或者管理員使用者的身份實現登入之後,即可在實現對該網站的phpinfo資訊的獲取。

漏洞復現

首先以一個普通使用者的身份實現登入

 

 

之後訪問下面的連結:

127.0.0.1/emlog/src/admin/index.php?action=phpinfo

可以看到輸出了該PHP網站中的主要配置資訊。

解決方法

1、限制許可權(僅僅允許管理員),修改程式碼如下

//phpinfo()  
if ($action == 'phpinfo') {  
    if (ROLE == ROLE_ADMIN){  
        @phpinfo() OR emMsg("phpinfo函式被禁用!");  
    }  
    else{  
        emMsg('許可權不足!','./');  
    }  
}  

2、由於配置資訊是後臺所需的,所以我們可以直接刪除該函式。

 

相關文章