"夜间无法登录":ThinkPHP api接口 23:00 准时罢工的排查全纪录
> 关键词:ThinkPHP、小程序、23:00-07:00、登录失败、SEO 木马、str_rot13、后门
> 发生时间:2025-09-20 ~ 2025-11-26
> 脱敏域名:https://your-domain.com
该问题已经折磨4-5个月了,今天终于一个一个文件打开手动检查,终于发现了问题所在,不知道其他人有没有遇到这种其他问题。
1. 故障现象
| 时间段 | 表现 |
|---|---|
| 每天 23:00 整 ~ 次日 07:00 | 小程序登录接口 100% 超时,其余时间完全正常 |
| 同时间段 curl / Postman | 返回正常 JSON,排除网络、证书、防火墙 |
| 服务器负载、内存、磁盘 | 均正常,无 502/503 |
结论 :问题不在网络、不在运维、不在代码逻辑,像"定时任务"一样神奇。
2. 初步排查(全部失败)
| 排查方向 | 结果 |
|---|---|
代码里是否写了 date('H') 限制 |
❌ 全局搜索无时间判断 |
| JWT token 过期/系统时间错乱 | ❌ date 与 NTP 差距 < 1s |
| nginx 错误日志 | ❌ 23:00 前后 无请求记录 |
| 云防火墙/WAF 定时策略 | ❌ 关闭 WAF 后故障依旧 |
| 微信后台"夜间维护"配置 | ❌ 无该功能 |
3. 转折点:curl 成功 vs 小程序失败
- curl 始终 200 → 后端 正常
- 真机 23:00 后失败 → 环境层被截流
于是怀疑 PHP 层代理/转发,全局搜关键字:
bash
find /www/wwwroot/ -name "*.php" -mtime -7 \
-exec grep -l "str_rot13\|onfr64_rapbqr" {} \;
于是怀疑 PHP 层代理/转发,全局搜关键字:

可以看到,这段小马代码藏的很"深",本身这页代码没几行,回车到600多行才出现木马了,于是我进行base64转义,发现了下面的问题。
关键路径:/www/wwwroot/domain.com/thinkphp/start.php
php
function function_tool(){
$rot="str_rot13";
$en=$rot("onfr64_rapbqr");
...
}

4. 木马行为解剖
| 解码后真相 | 作用 |
|---|---|
gmdate('G') 判断小时 |
06:00-23:00 只劫持 蜘蛛/手机 HTML |
| 23:00-06:00 | 所有请求 被 file_get_contents 转发到远程博彩服务器 |
| 本地生成缓存 | ./caches/xxx 目录,白天自动删除,毁灭痕迹 |
画成时间轴:
23:00 ─┐
├─ 用户 POST /api/login → 木马拦截 → 转发博彩站 → 返回空内容 → 小程序超时
07:00 ─┘
木马停止代理,接口恢复
5. 验证 & 复现
23:10
23:10 同网络 curl → 成功(绕过了 UA 判断)
23:10 查看 access.log → 无记录(请求被木马吞掉)
删除木马文件 + 清缓存目录 → 23:15 再测 → 登录成功 ✅

6. 清除与加固
bash
# 1. 备份证据
tar -zcf /tmp/backdoor_$(date +%F).tar.gz \
$(find . -name "*.php" -exec grep -l "str_rot13" {} \;)
# 2. 删除木马
sed -i '/function function_tool/,/function_tool();/d' infected.php
# 3. 清缓存
rm -rf caches/*
# 4. 目录锁权限
chmod 555 caches
chattr +i caches # 极端场景可加 immutable
7. 参考工具
- 在线 ROT13 + Base64 解码:https://rot13.com
- PHP后门特征库:https://github.com/nbs-system/php-malware-finder