### 简要描述:
TCCMS某处设计缺陷,成功打入官网后台!
### 详细说明:
问题发生在
app\controller\user.class.php
146行
```
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) {
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 );
}
```
这里调用了 $_Obj->create ();
学TP!
然后在看看
$_Obj->create (); 这个里面什么情况
```
public function create($datas = '') {
$data = array();
$data = $datas;
if (empty($data)) {
$data = $_POST['info'];
} elseif (is_object($data)) {
$data = get_object_vars($data);
} elseif (!is_array($data)) {
$msg = Config::lang("ILLEGALDATA");
exit($msg);
}
if (empty($_POST['info']) && empty($data)) { return false; }
$fieldsType = $this->types; //字段和默认值
$fieldsName = $this->fields; //字段和类型
$formKeyAry = array_keys($data); //post过来的所有$key
/* @var $key type */
foreach ($formKeyAry as $key) {
if (array_key_exists($key, $this->fields)) {
$val = isset($data[$key]) ? $data[$key] : NULL;
if (is_scalar($val)) {
if (false !== strpos($fieldsType[$key], 'int')) {
$val = intval($val);
} elseif (false !== strpos($fieldsType[$key], 'float') || false !== strpos($fieldsType[$key], 'double')) {
$val = floatval($val);
}
}
if (!is_null($val)) {
$this->$key = $val;
}
if (($data[$key] == "" || $data[$key] == NULL || $data[$key] === 0) && $fieldsName[$key] != "") {
$this->$key = $fieldsName[$key];
}
}
}
return $this;
}
```
$_POST['info'][xx] xx 直接是数据库字段 可以成功修改!
在
http://www.teamcen.com/index.php?ac=user_info
页面通过修改表单名称 成功把注册的普通帐号修改为了管理员帐号
### 漏洞证明:
成功打入后台!
什么注入都弱爆了!
直接执行SQL 好舒服
[<img src="https://images.seebug.org/upload/201311/2411335859bc8c7f86cefd329a5c545390153b4c.jpg" alt="tcms_admin.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201311/2411335859bc8c7f86cefd329a5c545390153b4c.jpg)
暂无评论