帮客户二开后的一个刷单源码(不是压缩过的模板):ThinkPHP5 写的抢单 + 商城 + 利息宝平台,前台 15 个控制器、后台 19 个模块、57 条支付插件、11 套语言。5594 个文件、102.7 MB。
体检先给结论:没有发现后门,但有两处必须在上线前处理——包里带着真实数据库账号密码,而且 app_debug 是 true。
规模与体积构成
| 目录 | 体积 | 说明 |
|---|---|---|
public/ | 72 MB | 多套前台皮肤(static、static_new、static_new6、static_98k、static_down、static_indonesia、alllang…)+ 上传图片 |
vendor/ | 17.1 MB | Composer 依赖 |
thinkphp/ | 10.4 MB | 框架本体(TP5,要求 PHP ≥ 7.0) |
application/ | 2.9 MB | 业务代码,唯一需要读懂的部分 |
前台:15 个控制器把流程串起来
Index(首页)、Shop(商城)、Order(下单)、RotOrder(轮单/派单)、Pay + Callback(支付与回调)、Crontab(定时任务)、My / User(个人中心)、Support(客服)、Send(短信/发信)、Api、Ctrl、Base、Error。
结构是老派 ThinkPHP 写法:控制器里直接写业务、视图是 .html 模板(里面嵌 PHP 和 JS),没有 Laravel 那套中间件分层。好处是改起来不用学框架,坏处是逻辑散,改一处要跟着看三处。
后台:19 个模块,重点是「打针」和「轮单」
Inyectar(打针管理,表xy_inyectar):给指定会员人工加/改数据,抢单盘的核心运营开关Deal(交易/商品、分类、利息宝lixibao)、RotOrder(轮单)Pay(支付通道配置)、Queue(队列)、Crontab(定时任务)Agent(代理)、User/Users(会员)、Group(权限组)、Menu(菜单)、Config/Usetting(站点设置)、Oplog(操作日志)、Help(帮助/公告)、Auth/Login
有 Oplog 操作日志和队列,说明这套东西是按「有客服、有代理、有运营」的团队规模设计的,不是单机玩具。
57 条支付插件 + 362 条通道参数
application/index/pay/ 下 57 个 PHP 文件,一个文件一条通道:Globalpay 还分了 20/51 三个版本、Vnmcard(越南卡)、Threektpay、Tikpay、Wowpay、Opaysecpay… 覆盖尼日利亚、印度、东南亚、拉美常见的本地收款网关。config/pay.php 里 362 条配置项。
注意:全部是法币网关,没有 USDT / TRC20 这类链上通道(我把 57 个文件全扫了,没有 tron/trc20/usdt 关键字)。要收 U 得自己接。
11 套语言包 + 多套皮肤
application/lang/ 下:en-au、en-els、en-id、en-ww、es-mx、iv-vn、jp、ko、pt-br、tr-tr、zh-cn,每套 24~43 KB(还有一份 lang_*.tar.gz 是备份,12 个文件,没藏东西)。配合 public/ 下多套静态皮肤,能按国家换皮。
体检结论(工具 + 手工双查)
- 无后门:扫了
application/与public/全部 PHP,0 处eval($_POST)、assert($_POST)、一句话木马、preg_replace /e型后门 - 自动扫描报了 110 处
php://input—— 全是支付回调读原始报文(Callback.php和 57 个 pay 文件),属正常写法,不是注入点 public/upload/里没有任何.php可执行文件(这是抢单盘最常见的挂马位置,这里干净)- 模板里 5 处「高危命中」实为:3 处模板内联 JS 的
eval、2 处 meta 里 base64 的水印
三处必须处理的问题
config/database.php带着真实数据库账号:库名/用户名d2862_kx7w2m(典型虚拟主机命名),密码明文写在文件里。拿到包的人等于拿到原站数据库凭据——上线前必须换成自己的库,并假设旧凭据已泄露。app_debug => true:调试模式开着,出错会直接把 SQL、路径、堆栈打到页面上。上线第一件事改成false。- 没有 SQL 建表脚本,也没有 install 向导:整个包 0 个
.sql、无install/目录。表结构只能从原库导出,或照着application/里的表名(如xy_inyectar)手工补——这是这套源码最贵的隐性成本。
另外:application/index/view/index/home.html 的 meta 里用 base64 藏了上游卖家的联系方式(解码后是某个源码站的三四个域名 + 一个 TG 号)。要卖或上线,先把这些水印清干净。
实跑记录:这套包是能跑起来的
为了验证「无 SQL」到底意味着多少工作量,我把它在本机跑了一遍:PHP 7.4 + SQLite(原包是 MySQL,改了一行 config/database.php)。过程如下:
- 反推表结构:扫描
application/与vendor/zoujingli里所有Db::name()/model()调用,得到 44 张业务表 plus ThinkAdmin 的system_*标准表,生成install.sql。字段按「宁多勿缺」策略生成宽表(xy_users一次就有 540 列),这样代码里任何where/insert都不会因为缺列报错。 - 补配置:前台一进去就 500,因为
sysconf()读system_config是空的。意外的是源码包的runtime/cache/里残留着一份序列化的站点配置(57 项:站点名、版权、存储、支付开关…),用unserialize()解出来直接灌进库即可。 - 补参考数据:
xy_index_msg里缺tiaokuan(条款)、huodong(活动)两条,xy_level缺 VIP 等级,xy_lixibao_list缺利息宝产品——少任何一条,首页/商城就白屏报「Trying to access array offset on value of type null」。 - 密码规则:会员是
sha1(密码 + salt + pwd_str),pwd_str明文写在config/app.php里;后台是明文存库,前端提交md5(密码 + session 里的 skey)。所以后台账号迁移时直接改system_user.password明文即可。 - MySQL 专有写法:
Db::raw('now()')在 SQLite 下直接报错,改date()才行——说明这份代码深度绑定 MySQL,换库不现实。
结论:代码本身是完整的、能跑通的,缺的是数据库。你真正要付的成本不是改代码,而是把 44 张表的结构补回来——要么从原站导一份 .sql,要么照上面的思路反推(我这一步花了大约 20 次调试才让首页、商城、订单、个人中心、后台菜单全部正常渲染)。
另外从截图里能看出一件事:这套是「音乐平台皮肤 + 抢单/刷单内核」——首页是歌单界面(Youtube Music、歌单/我的 TabBar、信用分),业务入口藏在图标格里;模板里还有 {$Think.lang.h_remen} 这类没翻译的占位符,说明语言包并不完整。
部署要点
- 环境:PHP 7.0~7.4(TP5 + 老代码,别上 PHP 8)+ MySQL 5.6/5.7;
runtime/需可写 - 伪静态指向
public/,把application、config、vendor挡在 web 根之外 - 改
config/database.php→ 导表 → 关app_debug→ 清runtime/缓存 - 支付通道在后台「支付配置」里逐条填商户号/密钥,回调地址必须是公网 https
- 上线后把
public/upload/的 PHP 执行权限关掉(nginx 里location ~ [.]php$对该目录直接 deny)
适合谁:需要一套多国家、多币种、多网关的抢单/任务盘底座,且自己有 PHP 团队能接手维护的人。这套的强项是支付通道数量与多语言皮肤,弱项是没有安装脚本、代码风格老、处处要手工兜底。
同类系统可以对照 抢单刷单栏目;如果需要现代化架构(Next.js + 后台控盘台),可看 Web3 抢单 DApp 站 v2.0。