网站地图    收藏   

主页 > 后端 > 网站安全 >

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

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] 好吧, 又是十几天没更新博客了 很多朋友让更新博客, 因为我想保证文章的质量, 不想发一些东西来滥竽充数, 所以可能博客今年的更新速度稍慢, 但是绝对能保证文章的质量也有朋友让我...

好吧, 又是十几天没更新博客了… 很多朋友让更新博客, 因为我想保证文章的质量, 不想发一些东西来滥竽充数, 所以可能博客今年的更新速度稍慢, 但是绝对能保证文章的质量
也有朋友让我发些生活类的东西, 因为我文笔实在不好, 要我写点文邹邹的东西我还真写不出来, 别到时候写些东西南北的出来被笑话啊~~ 所以说扯淡方面还是更多放在微博吧~~
 
好了, 言归正传. 由于前段时间和几个朋友想搞一下许山高(若是此明星的粉丝就绕道吧..别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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论