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

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

缺陷编号:wooyun-2014-069507

漏洞标题:Tccms sql注入#3(直接提示至管理员。官网demo成功)

相关厂商:teamcen.com

漏洞作者: roker

提交时间:2014-07-24 17:21

修复时间:2014-10-22 17:20

公开时间:2014-10-22 17:20

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经修复

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-24: 细节已通知厂商并且等待厂商处理中
2014-07-24: 厂商已经确认,细节仅向厂商公开
2014-09-17: 细节向核心白帽子及相关领域专家公开
2014-09-27: 细节向普通白帽子公开
2014-10-07: 细节向实习白帽子公开
2014-10-22: 厂商已经修复漏洞并主动公开,细节向公众公开

简要描述:

rt

详细说明:

看到 /app/controller/user.class.php
修改会员资料处

public function update() {
$_Obj = M ( 'user' );
if (($_POST ['info'] ['password'] !== $_POST ['password1'])) {
StringUtil::msgbox ( Config::lang ( "PWDNOTTHESAME" ), 'index.php?ac=users_info', 1 );
exit ();
}
$_Obj->create ();
if ($_POST ['info'] ['password'] != "" && ($_POST ['info'] [password] == $_POST ['password1'])) {
$_Obj->password = strlen ( $_POST ['info'] ['password'] ) > 15 ? $_POST ['info'] ['password'] : md5 ( $_POST ['info'] ['password'] );
}
if (empty ( $_POST ['info'] ['area'] )) {
$_Obj->area = "";
}
if (empty ( $_POST ['info'] ['city'] )) {
$_Obj->city = "";
}
//禁止修改管理员
$userObj = get ( "user", $_Obj->id );
if ($userObj->grade == 1 || $_POST["info"]["grade"] == 1) {
self::checkIsAdmin ();
}
//禁止修改别人的
$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 );
}


跟进updata()

public function update() {
$pKey = $this->PRI;
$this->db->Set($this->table, $this->data, 'where ' . $this->PRI . " = " . intval($this->$pKey), '');
$affected_rows = $this->db->affected_rows();
return $affected_rows;
}


set

public function Set($Table, $Data, $Condition = '', $unQuot = array()) {
if (is_array ( $Data )) {
$unQuot = is_array ( $unQuot ) ? $unQuot : explode ( ',', $unQuot );
foreach ( $Data as $key => $val ) {
$val = ($val || $val == 0) ? mysql_real_escape_string ( $val ) : '';
$Values .= "`" . $key . '`=' . (in_array ( $key, $unQuot ) ? "{$val}," : "'{$val}',");
}
$Values = rtrim ( $Values, ',' );
} else {
$Values = mysql_real_escape_string ( $Data );
}
return $this->query ( "UPDATE `{$Table}` SET {$Values} {$Condition}" );
}


将我们 post过来的数据foreach 进sql了。只检测了 grade 不能为1
但是 ,我们看到 后台登入界面

public function adminLogin($username, $password) {
$sql = "select * from " . $this->table . " where username='$username' and password='$password' and isadmin = 1 and status=1";


因为 普通会员 和 管理员 是一个表的。 权限判断的区别 就是 isadmin字段吧,
我们 修改资料
抓包

1.jpg


即可 提升至管理员
官网测试成功。

2.jpg

漏洞证明:

2.jpg

修复方案:

修复~

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-07-24 21:39

厂商回复:

不错,忽略了这个细节

最新状态:

2014-07-25:fixed