好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

HDWiKi(互动百科)V5.1两枚注入及修复 - 网站安全

好吧, 又是十几天没更新博客了… 很多朋友让更新博客, 因为我想保证文章的质量, 不想发一些东西来滥竽充数, 所以可能博客今年的更新速度稍慢, 但是绝对能保证文章的质量 也有朋友让我发些生活类的东西, 因为我文笔实在不好, 要我写点文邹邹的东西我还真写不出来, 别到时候写些东西南北的出来被笑话啊~~ 所以说扯淡方面还是更多放在微博吧~~   好了, 言归正传. 由于前段时间和几个朋友想搞一下许山高(若是此明星的粉丝就绕道吧..别BLX)的官方 论坛 ~ 主站程序是Discuz!X2的, 我等小菜手里肯定是没0day了, 看了下旁站有一个许嵩百科, 使用的HDWiKi百科程序, 就下下来了一套一直放着没管, 直到前几天才花时间看了一下, 发现了一些问题, 废话不多说~~ 直接进正题~~   注入1:     // control/user.php (551行)        function dospace(){               $uid = $this->get[2]; //取uid               $type=(isset($this->get[3]))?intval($this->get[3]):0;               $page = max(1, intval($this->get[4]));               $num = isset($this->setting['list_prepage'])?$this->setting['list_prepage']:20;               $start_limit = ($page - 1) * $num;               //print_r($this->user); 无视               $_ENV['user']->update_field('views',1,$uid,0); //更新用户浏览次数  By.Rices Blog: Rices.so               if($uid == $this->user['uid']){                      $spaceuser = $this->user;                      $spaceuser['views']++;                      $spaceuser['editorstar'] = $_ENV['usergroup']->get_star($spaceuser['stars']);               }elseif(is_numeric($uid)){                      $spaceuser = $_ENV['usergroup']->get_groupinfo($uid);               }else{                      $spaceuser = $_ENV['usergroup']->get_groupinfo($uid,'u.username');                      $uid=$spaceuser['uid'];               }               if(!(bool)$spaceuser){                      $this->message($this->view->lang['loginTip3'],'BACK',0);               }   www.2cto.com               $spaceuser['image'] = $_ENV['global']->uc_api_avatar($spaceuser['image'], $spaceuser['uid'], 'middle');               $spaceuser['regtime'] = $this->date($spaceuser['regtime']);               switch ($type) {                      case 0:                      case 1:                                $doccount=($type)? $spaceuser['edits'] : $spaceuser['creates'];                             break;                      case 2:                             $doccount = $_ENV['user']->get_totalfavotire($uid);               }               $doclist = $_ENV['user']->space($uid,$type,$start_limit,$num);               $departstr=$this->multi($doccount, $num, $page,"user-space-$uid-$type");               $this->view->assign('uid',$this->user['uid']);               $this->view->assign('departstr',$departstr);               $this->view->assign('type',$type);               $this->view->assign('doclist',$doclist);               $this->view->assign('spaceuser',$spaceuser);               $_ENV['block']->view('space');        }   这里$uid没任何过滤, 继续追下update_field函数:     // model/user.class.php (337行) By.Rices Blog: Rices.so        function update_field($field,$value,$uid,$type=1){               if($type){                      $sql="UPDATE ".DB_TABLEPRE."user SET $field='$value' WHERE uid= $uid "; //入库               }else{                      $sql="UPDATE ".DB_TABLEPRE."user SET $field=$field+$value WHERE uid= $uid "; //入库               }               $this->db->query($sql);        } so..典型的注入了~ 直接放语句里面执行了, 没引号或者双引号包围, 那么就不必考虑GPC的问题了~ 但是这里是update语句, 具体就要看怎么利用了, 如果是set后的数据可控, 那么还可以构造一个update注入, 比如直接将管理员密码更新进去等.. 但是这里是where可控, 所以从表面看没利用价值… 直接放 浏览器 测试, 可爱的 mysql 错误信息出现了:   既然有错误信息, 那这个注入自然就有价值了~ 直接构造报错注入, 成功爆出了管理员帐号和密码, 这里要感谢condor(注入小神童)大牛的指点, 测试效果如下:     注入2:     // control/user.php (458行)        function dogetpass(){ //找回密码函数               if(isset($this->get[2])){                      $uid=$this->get[2]; //取得uid                      $encryptstring=$this->get[3];                      $idstring=$_ENV['user']->get_idstring_by_uid($uid,$this->time); //返回找回密码KEY  By.Rices Blog: Rices.so                      echo "<br />".$idstring;                      if($idstring==$encryptstring){                             $this->view->assign('uid',$uid);                             $this->view->assign('encryptstring',$encryptstring);                             //$this->view->display('resetpass');                             $_ENV['block']->view('resetpass');                      }else{                             $this->message($this->view->lang['resetPassMessage'], WIKI_URL ,0);                      }               }elseif(isset($this->post['verifystring'])){ ............以下部分代码省略 同样的, UID没过滤, 继续看get_idstring_by_uid函数:     // model/user.class.php (93行)  By.Rices Blog: Rices.so        function  get_idstring_by_uid($uid,$time){               return $this->db->result_first("SELECT code FROM ".DB_TABLEPRE."activation WHERE uid=$uid AND available=1  AND type=1 AND time>($time-3*24*3600) ORDER BY time DESC"); //入库查询        } 同样的直接入库了~ 无引号包围, 所以GPC同样无视, 直接使用上一个注入中的利用方式, 报错搞定之:   由于我只看了用户处理方面的文件, 所以其他文件有多少问题就是未知了, 有兴趣的可以自己看看~~ 另外用户处理方面还有个较严重的问题, 这里就不发出来了, 还是老话, 有兴趣的朋友自己看.. 作者 rices.so

查看更多关于HDWiKi(互动百科)V5.1两枚注入及修复 - 网站安全的详细内容...

  阅读:47次