来源:自学PHP网 时间:2015-04-17 10:15 作者: 阅读:次
[导读] Tipask问答系统是一款开放源码的PHP仿百度知道程序。以国人的使用习惯为设计理念,采用MVC构架,系统具有速度快,SEO友好,界面操作简洁明快等特点。但是Tipask后台中存在问题,所以...
Tipask问答系统是一款开放源码的PHP仿百度知道程序。以国人的使用习惯为设计理念,采用MVC构架,系统具有速度快,SEO友好,界面操作简洁明快等特点。
但是Tipask后台中存在问题,所以导致进入后台的用户可以执行任意代码。
详细说明:在control/admin/db.php onimport()函数中
/*数据库导入*/ function onimport() { set_time_limit(0); if(substr(trim(ini_get('memory_limit')),0,-1)<32&&substr(trim(ini_get('memory_limit')),0,-1)>0) { @ini_set('memory_limit','32M'); } $filename=str_replace('*','.',$this->get[2]); $filenum=$this->get[3]?$this->get[3]:1; $filedir="./data/db_backup/"; $filetype=$this->get[4]?$this->get[4]:substr($filename,-3); if($filetype!='zip'&&$filetype!='sql') { $this->message('文件格式不正确','BACK'); }else { if($filenum==1) { if($filetype=='zip') { require_once TIPASK_ROOT.'/lib/zip.class.php'; $zip=new zip(); if(!$zip->chk_zip) { $this->message('chkziperror',''); } $zip->Extract($filedir.$filename,$filedir); $filename=substr($filename,0,-4)."_1.sql"; }else { $num=strrpos($filename,"_"); $filename=substr($filename,0,$num)."_1.sql"; } } if(file_exists($filedir.$filename)) { $sqldump=readfromfile($filedir.$filename); preg_match('/#\sVersion:\sTipask\s([^\n]+)\n/i',$sqldump,$tversion); if($tversion[1]!=TIPASK_VERSION) { $this->message('导入的备份数据文件版本不正确','admin_db/backup'); } $sqlquery = $_ENV['db']->splitsql($sqldump); unset($sqldump); foreach($sqlquery as $sql) { $sql = $_ENV['db']->syntablestruct(trim($sql), $this->db->version() > '4.1', DB_CHARSET); if($sql != '') { $this->db->query($sql, 'SILENT'); if(($sqlerror = $this->db->error()) && $this->db->errno() != 1062) { $this->db->halt('MySQL Query Error', $sql); } } } if($filetype=='zip') { @unlink($filedir.$filename); } $filenum++; $num=strrpos($filename,"_"); $filename=str_replace('.','*',substr($filename,0,$num)."_".$filenum.".sql"); $this->message("<image src='css/default/loading.gif'><br />".'第 '.($filenum-1).' 个文件已经完成!正在进入下一个备份!', "admin_db/import/$filename/$filenum/$filetype"); }else { $this->cache->remove('import_files'); $this->message('导入数据成功!','admin_db/backup'); } } }
$zip->Extract($filedir.$filename,$filedir);
其中可以看到如果导入的是zip,那么将解压缩get[2]中的zip包到/data/db_backup/中,其中get[2]可控。
$filename=str_replace('*','.',$this->get[2]);
在开始将*替换回.
所以使用**\来进行目录跳转。
首先在提问那上传一个含有shell的zip文件,记下路径,然后在后台数据库备份处选导入,抓包,把文件路径替换为zip的路径。 example:
http://127.0.0.1/tipask2/index.php?admin_db/import/**\attach\1306\dBhFIKDQ*zip
之后shell将解压到./data/db_backup中
修复方案:
估计厂商不会认领,so... |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com