网站地图    收藏   

主页 > 后端 > 网站安全 >

tipask 2.0 后台任意代码执行 - 网站安全 - 自学ph

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

添加评论