phpok最新版SQL注入二

漏洞作者: pandas

缺陷文件:framework/phpok_call.php line:108 [php] function _project($rs) { return $GLOBALS['app']->model('data')->project($rs); } [/php] 跟踪project方法:framework/model/data.php [php] public function project($rs) { if(!$rs['pid'] && !$rs['phpok']) return false; if(!$rs['pid']) { $tmp = $this->_id($rs['phpok'],$this->site['id']); if(!$tmp || $tmp['type'] != 'project') return false; $rs['pid'] = $tmp['id']; } if(!$rs['pid']) return false; $rs = $this->_project($rs['pid'],$rs['project_ext']); //继续跟踪_project方法 if(!$rs) return false; //绑定链接 if(!$rs['url']) $rs['url'] = $GLOBALS['app']->url($rs['identifier']); return $rs; }   public function _project($id,$ext=false) { if($this->cdata['project'][$id]) {//echo "aaa";exit; $rs = $this->cdata['project'][$id]; } else { $sql = "SELECT * FROM ".$this->db->prefix."project WHERE id=".$id;//注意此处变量id即为$rs['pid'],继续跟踪看看是否可控,如果可控则存在SQL注射漏洞! //print_r($sql);   $rs = $this->db->get_one($sql); //if(!$this->cdata['project']) //echo $id.'---'.$rs; $this->cdata['project'][$id] = $rs; } if(!$rs) return false; if($ext) { $ext = $this->ext_all('project-'.$id); if($ext) $rs = array_merge($ext,$rs); } return $rs; } [/php]   回溯$rs['pid']是从哪里传递过来的: framework/api/api_control.php [php] function phpok_f() { $id = $this->get('id');//get方法传值,会对敏感字符进行addslashes if(!$id) $this->json('未指定数据调用中心ID'); $param = $this->get('param');//这里就是$rs,见phpok方法 $list = $this->call->phpok($id,$param); //注意,继续跟方法phpok if(!$list) $this->json('ok',true,true,false); $tpl = $this->get("tpl"); if($tpl && $this->tpl->check_exists($tpl)) { $this->assign("rslist",$list); $info = $this->fetch($tpl); $this->json($info,true,true,false); } $this->json($list,true); }   function phpok($id,$rs="") {//很清楚了,$rs就是通过GET方法传递的param if(!$id) return false; ...省略 if(substr($id,0,1) != '_') ...省略 else { if(!$rs || !is_array($rs)) return false; //arclist,文章列表 //arc,单篇文章信息 //cate,分类信息 //catelist,分类树 //project,项目信息 //sublist,子项目信息 //parent,父级项目信息 //plist,同级项目信息 //fields,字段表单 //user,会员 //userlist,会员列表 //total,文章总数 //cate_id,当前分类信息(不带项目,不生成链接) //subcate,子分类信息,即当前分类下的子分类 $list = array('arclist','arc','cate','catelist','project','sublist','parent','plist','fields','user','userlist','total','cate_id','subcate'); $id = substr($id,1); //如果是arclist,且未定义is_list属性,则默认启用此属性 if($id == "arclist") { $rs["is_list"] = $rs["is_list"] == 'false' ? 0 : 1; } if(!$id || !in_array($id,$list)) return false;//控制器 $call_rs = array_merge($rs,array('type_id'=>$id)); } $content = $this->load_call($call_rs); if($content && $cacheId) $GLOBALS['app']->cache->write($cacheId,$content); return $content; } [/php]

漏洞证明:

分析了半天,懂的人应该就懂了,EXP如下: 1017083222302ce7b5439a6cd3cc691c1e6cc0c7

2 条评论

  1. hehe

    为啥我这边数据跟踪到id都没问题,但是查询之后没结果 :???:
    然后那个啥,楼主用的哪个版本
    $rs = $this->db->get_one($sql); 这个函数在哪
    原谅我小白 :razz:

    1. 0day5
      @hehe

      这个系转载的..

发表评论