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

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

缺陷编号:wooyun-2015-0118390

漏洞标题:ThinkSNS 4.0 一处设计缺陷(可伪造任意人发朋友圈)

相关厂商:ThinkSNS

漏洞作者: 路人甲

提交时间:2015-07-06 12:31

修复时间:2015-10-09 12:32

公开时间:2015-10-09 12:32

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

危害等级:中

自评Rank:10

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-07-06: 细节已通知厂商并且等待厂商处理中
2015-07-11: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-09-04: 细节向核心白帽子及相关领域专家公开
2015-09-14: 细节向普通白帽子公开
2015-09-24: 细节向实习白帽子公开
2015-10-09: 细节向公众公开

简要描述:

通常用于诈骗!

详细说明:

官方的demo已经是4.0,可惜下不到源码
翻来看看ThinkSNS 3.0的源码,发现一处严重的设计缺陷
apps\public\Lib\Action\AccountAction.class.php 下doSaveProfile方法为保存用户信息操作

/**
* 保存基本信息操作
* @return json 返回操作后的JSON信息数据
*/
public function doSaveProfile() {
$res = true;
// 保存用户表信息
if(!empty($_POST['sex'])) {
$save['sex'] = 1 == intval($_POST['sex']) ? 1 : 2;
// $save['lang'] = t($_POST['lang']);
$save['intro'] = t($_POST['intro']);
// 添加地区信息
$save['location'] = t($_POST['city_names']);
$cityIds = t($_POST['city_ids']);
$cityIds = explode(',', $cityIds);
if(!$cityIds[0] || !$cityIds[1] || !$cityIds[2]) $this->error('请选择完整地区');
isset($cityIds[0]) && $save['province'] = intval($cityIds[0]);
isset($cityIds[1]) && $save['city'] = intval($cityIds[1]);
isset($cityIds[2]) && $save['area'] = intval($cityIds[2]);
// 修改用户昵称
$uname = t($_POST['uname']);
$oldName = t($_POST['old_name']);
$save['uname'] = filter_keyword($uname);
$res = model('Register')->isValidName($uname, $oldName);//这里跟进
if(!$res) {
$error = model('Register')->getLastError();
return $this->ajaxReturn(null, model('Register')->getLastError(), $res);
}
//如果包含中文将中文翻译成拼音
if ( preg_match('/[\x7f-\xff]+/', $save['uname'] ) ){
//昵称和呢称拼音保存到搜索字段
$save['search_key'] = $save['uname'].' '.model('PinYin')->Pinyin( $save['uname'] );
} else {
$save['search_key'] = $save['uname'];
}
$res = model('User')->where("`uid`={$this->mid}")->save($save);
$res && model('User')->cleanCache($this->mid);
$user_feeds = model('Feed')->where('uid='.$this->mid)->field('feed_id')->findAll();
if($user_feeds){
$feed_ids = getSubByKey($user_feeds, 'feed_id');
model('Feed')->cleanCache($feed_ids,$this->mid);
}
}


修改用户昵称这里$uname 是你想修改的昵称(你是A,你想修改成B)$oldName是你以前的昵称,我们跟进$res = model('Register')->isValidName($uname, $oldName);这个函数

/**
* 验证昵称内容的正确性
* @param string $name 输入昵称的信息
* @param string $old_name 原始昵称的信息
* @return boolean 是否验证成功
*/
public function isValidName($name, $old_name = null) {
// 默认不准使用的昵称
$protected_name = array('name', 'uname', 'admin', 'profile', 'space');
$site_config = model('Xdata')->get('admin_Config:site');
!empty($site_config['sys_nickname']) && $protected_name = array_merge($protected_name, explode(',', $site_config['sys_nickname']));
$res = preg_match($this->_name_reg, $name) !== 0;
if($res) {
$length = get_str_length($name);
$res = ($length >= 2 && $length <= 10);
} else {
$this->_error = '仅支持中英文,数字,下划线';
$res = false;
return $res;
}
// 预保留昵称
if(in_array($name, $protected_name)) {
$this->_error = L('PUBLIC_NICKNAME_RESERVED'); // 抱歉,该昵称不允许被使用
$res = false;
return $res;
}
if(!$res) {
$this->_error = L('PUBLIC_NICKNAME_LIMIT', array('nums'=>'2-10')); // 昵称长度必须在2-10个汉字之间
return $res;
}
if(($name != $old_name) && $this->_user_model->where('`uname`="'.mysql_escape_string($name).'"')->find()) {
$this->_error = L('PUBLIC_ACCOUNT_USED'); // 该用户名已被使用
$res = false;
}
// 敏感词
if (filter_keyword($name) !== $name) {
$this->_error = '抱歉,该昵称包含敏感词不允许被使用';
return false;
}
return $res;
}


这里主要经过三次审核:
1.是否使用预保留的名称array('name', 'uname', 'admin', 'profile', 'space');
2.判断昵称长度是否是2-10个汉字之间;
3.判断用户昵称是否被使用。
我们直接看看第三处的判断逻辑:用户昵称是否被使用
if(($name != $old_name) && $this->_user_model->where('`uname`="'.mysql_escape_string($name).'"')->find()) {
如果$name != $old_name,则进入if。但是old_name可被参数传入,我直接更改old_name和name为任意的同一个人就绕过该if逻辑了!
同时我们看看安装好ThinkSNS 3后数据库人员信息:

11111.jpg


管理员的昵称是“管理员”,不在保留的名称array('name', 'uname', 'admin', 'profile', 'space')里,所以也可以更改为管理员。。。

漏洞证明:

现在官方demo是ThinkSNS 4版本的,注册一个账户,编辑我的个人信息
http://demo.thinksns.com/ts4/index.php?app=public&mod=Account&act=index

1.jpg


在朋友圈里看到一个人Clay
http://demo.thinksns.com/ts4/index.php?app=public&mod=Profile&act=index&uid=32323

2.jpg


貌似是个技术总监,那我们抓包更改我的个人信息试下:

3.jpg


发现我也是技术总监了!

4.jpg

修复方案:

为欺诈留下很好的后门...

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-10-09 12:32

厂商回复:

漏洞Rank:2 (WooYun评价)

最新状态:

暂无