网站地图    收藏   

主页 > 后端 > 网站安全 >

新浪Xweibo程序伪造管理员给任意/全体用户发消息

来源:自学PHP网    时间:2015-04-17 13:02 作者: 阅读:

[导读] 起因是发现了xweibo某个注入漏洞,但是后来发现这个功能是需要管理权限的,总是这样大意。。。不过还是找到点好玩的东西。详细说明:首先xweibo搞了个路由函数,对用户提交的变量...

起因是发现了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);
                     省略 www.2cto.com                    
                     $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等检测。
 
 
作者:牛奶坦克

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论