来源:自学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