当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-025803

漏洞标题:tipask 2.0 后台任意代码执行

相关厂商:tipask

漏洞作者: 猪头子

提交时间:2013-06-13 10:38

修复时间:2013-09-11 10:39

公开时间:2013-09-11 10:39

漏洞类型:命令执行

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-06-13: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-09-11: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

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中

3.jpg

修复方案:

估计厂商不会认领,so...

版权声明:转载请注明来源 猪头子@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝