0x00 前言

叠甲声明:本文仅为安全漏洞技术复盘、内部自查修复参考,仅供给系统运维人员修补自身部署的魔方财务,严禁用于未授权测试、攻击他人系统,利用下述漏洞实施非法操作将触犯刑法,承担刑事责任。所有内容仅做安全研究学习,请收到漏洞的管理员第一时间修复加固,切勿尝试非授权利用。

魔方财务作为一个“优秀”的系统,里面藏着许多“实用”的接口(懂得都懂)

这个接口可以使用两个方法让我们吃上“免费三餐+包吃包住”,其分别为:SQL注入、0元购

0x01 法律风险提示

  1. 利用 0 元购漏洞免费开通业务、获取虚拟服务、倒卖牟利 —《刑法》第二百六十四条 盗窃罪 以非法占有为目的,通过篡改请求参数绕过支付校验,在未付费情况下获取付费云服务,司法实践多按盗窃罪处理。

  • 数额较大(一般 1000‑3000 元起):三年以下有期徒刑、拘役或者管制,并处罚金;

  • 数额巨大:三年以上十年以下有期徒刑,并处罚金;

  • 数额特别巨大:十年以上有期徒刑或者无期徒刑,并处罚金或者没收财产。

《刑法》第 287 条:利用计算机实施盗窃,依照盗窃罪定罪处罚。

  1. 利用预认证 SQL 注入拖库、读取账号手机号、邮箱、密码哈希等数据 —《刑法》第二百八十五条第二款 非法获取计算机信息系统数据罪 无需登录即可执行 SQL 注入,非法获取系统内部存储的用户身份数据,达到 “情节严重” 标准即可入罪:

  • 情节严重:三年以下有期徒刑或者拘役,并处或者单处罚金;

  • 情节特别严重:三年以上七年以下有期徒刑,并处罚金。

违法所得 5000 元以上、造成损失 10000 元以上、获取大量身份信息,即可认定情节严重。

  1. IDOR 越权读取、删除他人站内信、工单账单等敏感数据 同样归属于非法获取计算机信息系统数据罪范畴;如果大量篡改、删除业务数据,还可能触及破坏计算机信息系统罪(刑法 286 条),后果严重可处五年以下有期徒刑,后果特别严重五年以上有期徒刑。

  2. 民事责任《民法典》第九百八十五条 不当得利 即便不满足刑事立案标准,通过漏洞获得的服务、利益属于不当得利。受害方有权通过民事诉讼,要求全额赔偿全部经济损失。

0x02 修复方法

方案 A:删除整个 /v1 接口(推荐)

打开 data/route/openapi.php,将其中两个 Route::group("v1", ...) 代码块整块注释或删除(第一段是免登录公共接口,第二段是登录后业务接口):

<?php
$origin = request()->header("origin");
think\facade\Route::get("document", "openapi/Document/index");
// think\facade\Route::group("v1", function () { ... 整段注释/删除 ...
// think\facade\Route::group("v1", function () { ... 整段注释/删除 ...

如果你的文件是加密的,直接覆盖成改成这样就行了:

<?php
$origin = request()->header("origin");
think\facade\Route::get("document", "openapi/Document/index");
?>

这个接口就是/document目录下接口,删了后就不能调用了,如有其他程序需要此接口,按需保留/使用PlanB/PlanC

方案 B:改前缀(有其他程序调用接口时)极不推荐

若怕财务炸,把两个 group 的前缀改为不可猜测的随机字符串(不要用 v2 这类可枚举值):

think\facade\Route::group("v757nkxq", function () {
    // 原有路由保持不动
});

注意:改名只是缓解,能挡住批量扫描和无目标攻击者;前缀一旦泄露,SQL 注入与 0 元购原样存在。

方案 C:第三方补丁(PlanB的替代方法)

Github:https://github.com/chuzhongyun/zjmf-v1-route-disable-fix

方案 D:WAF拦截

正则表达式:[sS]=.*?[vV]1\/

以上四种方法不会对魔方原本产生任何问题,上下游对接也不会产生任何问题,受影响的只有基于/document目录下API文档所开发的财务套壳等第三方程序。

你们要是还是愿意信会影响那你不要用了,我是真没招了,也不要来问我操作了之后我站怎么怎么滴了,我不知道。我只能说我上游、我自己都直接删接口了,并且我用我主站也测试了一天了才发出来的方法,要是有问题早就发现了,所以出问题不要找我,我不背锅。

反正就一句话:方法给你了,用不用是你自己的事,跟我半毛钱关系也没有,我只是好意提醒,至于信不信由你自己定。

还有哪些一发出来啥漏洞就 TMD 批量扫站的你们也真 TMD 啥也不是,连最基本的做人都做不好,这辈子也就这样了,顶多给社会添点负资产。你们 “好样的”。

0x03 特别鸣谢

  • 爱睡觉是天赋(冥雾云)

  • 吴基岩(二五云)

  • chy(方澄云)

  • 欢(星空云、NekoCloud、拼好机)

  • xioiox(7inet)

  • 不愿意透露姓名的好心人(初衷云)

0x04 漏洞利用方法

AI总结的,懒得自己写,原理大概就是这样

漏洞一:未授权 SQL 注入(second_verify)

位置:app/openapi/controller/PublicController.php — secondVerify()

$clients->where("phonenumber=\"" . $data["account"] . "\" OR email=\"" . $data["account"] . "\"");

account 参数来自请求,未做任何过滤,直接拼接进 WHERE 条件。攻击者传入 1" OR 1=1-- 之类的 payload 即可篡改查询逻辑,配合布尔/时间盲注可拖取 clients 表(用户名、手机号、邮箱、密码哈希)。

关键在于:POST /v1/second_verify 位于第一路由组,UserCheck 对无效 token 不拦截——无需登录即可触发。这是一个预认证 SQL 注入。


漏洞二:0 元购(cart/checkout 的 resource_percent_value)

位置:app/openapi/controller/CartController.php — cartCheckout()

结账流程里有一段"资源类商品按代理等级打折"的逻辑:

$param = $this->request->param();
if (isset($param["resource_percent_value"])) {
    $resource_percent_value = $param["resource_percent_value"]; // 无类型/范围校验
    $price_setup = bcmul($price_setup, $resource_percent_value);
    $price_cycle = bcmul($price_cycle, $resource_percent_value);
    // ... 其余价格字段同样被乘
}

两个致命点:

  1. 百分比由客户端传入且无校验——传 0 就是 0;

  2. 这段代码在 api_type == "resource" 判断块之外——对所有商品生效,不限资源类。

攻击链路:

登录 → 加购任意付费商品 → POST /v1/cart/checkout 携带 resource_percent_value=0
     → 所有价格归零 → total = 0
     → 系统执行 if ($total == 0) 分支:
        invoices 更新为 Paid + processPaidInvoice() → 自动开通主机

这是一个可稳定复现的完整 0 元购。另外,同一参数还被透传进产品升级流程(HostController、ProductController 的 upgradeConfig*),只修结账一处可能被绕过。


漏洞三:越权访问他人消息(IDOR)

位置:app/openapi/controller/MessageController.php — message() / readMessage() / deleteMessage()

$params = $this->request->param();   // 用户可控
$query->where("sm.uid", $params["uid"]);

正确写法应使用中间件注入的可信身份 request()->uid,这里却用了请求参数里的 uid。攻击者登录自己的账号后把 uid 改成任意数字,即可读取、标记已读、删除任意用户的站内信(含工单回复、账单通知等敏感内容)。