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

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

缺陷编号:wooyun-2012-05235

漏洞标题:新浪Xweibo程序伪造管理员给任意/全体用户发Notice

相关厂商:新浪

漏洞作者: 牛奶坦克

提交时间:2012-03-13 15:51

修复时间:2012-04-27 15:51

公开时间:2012-04-27 15:51

漏洞类型:未授权访问/权限绕过

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

起因是发现了xweibo某个注入漏洞,但是后来发现这个功能是需要管理权限的,总是这样大意。。。不过还是找到点好玩的东西。

详细说明:

首先xweibo搞了个路由函数,对用户提交的变量做同一的分配控制
function V($vRoute,$def_v=NULL,$setVar=false){
static $v;
if (empty($v)){$v = array();}
$vRoute = trim($vRoute);
//强制初始化值
if ($setVar) {$v[$vRoute] = $def_v;return true;}
if (!isset($v[$vRoute])){
$vKey = array('C'=>$_COOKIE,'G'=>$_GET, 'P'=>$_POST,'R'=>$_REQUEST,
'F'=>$_FILES, 'S'=>$_SERVER, 'E'=>$_ENV,
'-'=>$GLOBALS[V_CFG_GLOBAL_NAME]
);
if (empty($vKey['R'])) {
$vKey['R'] = array_merge($_COOKIE, $_GET, $_POST);
}
if ( !preg_match("#^([cgprfse-])(?::(.+))?\$#sim",$vRoute,$m) || !isset($vKey[strtoupper($m[1])]) ){
trigger_error("Can't parse var from vRoute: $vRoute ", E_USER_ERROR);
return NULL;
}
省略
用户操作功能都封装在了action模块中,action.mod.php,找到sendNotice这个action
function sendNotice() {
$nowTime = APP_LOCAL_TIMESTAMP;
$sina_uid = V('p:uid', 0);
$title = trim(V('p:title', ''));
$content = trim(V('p:content', ''));
$available_time = (int)V('p:available_time', $nowTime);
省略
$rst = DR('notice.sendNotice', '', $title, $content, $sina_uid, null, 0, $available_time);
if (!empty($rst['errno'])) {
APP::ajaxRst(false, $rst['errno'], $rst['err']);
exit;
} else {
APP::ajaxRst(true, 0);
exit;
}
}
没啥限制额,在看看notice中的功能定义
$send_all = $sina_uid === 0 ? true : false; //是否发送给全站用户

if (is_null($sina_uid)) {
$sina_uid = array();
} else if (!is_array($sina_uid)) {
$sina_uid = (array)$sina_uid;
}
... ...
$data = array();
$data['sender_id'] = $sender_id;
$data['title'] = $title;
$data['content'] = $content;
$data['add_time'] = APP_LOCAL_TIMESTAMP;
$data['available_time'] = empty($available_time) ? APP_LOCAL_TIMESTAMP : $available_time;

$notice_id = $this->db->save($data, 0, T_NOTICE);
if ($notice_id === false) {
return RST(false, 1210004, '发送失败,请重试');
}
直接构造利用这个action
POST /?m=api/weibo/action.sendNotice&_=1331620238391 HTTP/1.1
.. ..
uid=[改为0为群发,其他用户uid为单独发送]&title=[标题]&content=[内容]&available_time=123123123


另外,最后发现显示内容还没有做html格式化,所以还能以管理员名义给全站用户来个xss,这个xss的意义在于可以绕过官方限制做一些加关注,发微博等所有xweibo接口支持的用户操作功能(经过确认xweibo没啥限制),可以控制这个xweibo站点上所有用户/微博用户的行为。

漏洞证明:



修复方案:

1,notice接口需要身份限制;
2,xss问题需要转义;
3,其他微博操作接口需要做csrf,referer等检测。

版权声明:转载请注明来源 牛奶坦克@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2012-03-13 18:04

厂商回复:

感谢提供,正在处理

最新状态:

暂无


漏洞评价:

评论

  1. 2012-03-13 15:57 | 坏人咖啡 ( 实习白帽子 | Rank:55 漏洞数:4 | 做一个简简单单的坏人)

    很好很强大表示关注

  2. 2012-03-13 16:10 | 黑龙 ( 路人 | Rank:5 漏洞数:4 | http://bit.ly/zCr8h5)

    好玩儿吗?等细节

  3. 2012-03-13 17:32 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    坐等细节。

  4. 2012-03-13 19:38 | horseluke ( 普通白帽子 | Rank:116 漏洞数:18 | Realize the dream in earnest.)

    我是现在这个项目的程序员。今天病了,明日早上回公司看看具体安排。先多谢作者提交。

  5. 2012-03-13 19:44 | horseluke ( 普通白帽子 | Rank:116 漏洞数:18 | Realize the dream in earnest.)

    另外问问洞主,你说的SQL注入问题可否bypass今年2月补丁中内置的Mysqlids的拦截?

  6. 2012-03-13 22:35 | 牛奶坦克 ( 普通白帽子 | Rank:355 漏洞数:21 | 晚安,牛奶)

    @horseluke 那个地方看到需要管理员权限就没在跟了,可以抽时间在看一下。

  7. 2012-03-14 11:21 | horseluke ( 普通白帽子 | Rank:116 漏洞数:18 | Realize the dream in earnest.)

    @牛奶坦克 内部讨论后,发现是典型的应用场景变更没注意细节所引发的血案 -_-|| 一些类似关联(虽然讲的copy代码和这个漏洞无关):(1)http://weibo.com/1679264133/y9Gr05Xbr (2)http://weibo.com/1679264133/y9GrUx2wx (3)http://weibo.com/1679264133/y9GvwwVYq

  8. 2012-04-18 19:16 | horseluke ( 普通白帽子 | Rank:116 漏洞数:18 | Realize the dream in earnest.)

    To all,漏洞已修复。由于内部发布故障,在细节公开截至前发布。再次感谢@牛奶坦克 的提交。修复地址:http://bbs.x.weibo.com/viewthread.php?tid=127622

  9. 2012-04-19 14:42 | 牛奶坦克 ( 普通白帽子 | Rank:355 漏洞数:21 | 晚安,牛奶)

    @horseluke 给力!