同行 CMS 的入口文件被换成篡改脚本,公开问题单里能读出什么

📅 2026-10-10 👁️ 0

同行内容系统的入口文件被替换成篡改脚本,公开问题单里能读出哪些线索?这份问题单(PbootCMS 的 issue #50,标题写的是「最新版本漏洞还在,新的脚本篡改病毒」)可核对的字段有三条时间线与两处文件名:2026 年 6 月 23 日 core/start.php 被篡改,6 月 24 日首页 index.php 被篡改,问题单创建于 6 月 25 日、7 月 8 日关闭。被写入的脚本不直接输出固定内容,而是先读访客标识与来源引用,判断这次访问是否来自搜索引擎,再取回外部地址的内容输出。对内容站来说,这就是典型的「只对爬虫展示」的篡改形态。

问题单里能读到的三条时间点

可核对字段 记录值 读法
首次篡改 2026/6/23,入口启动文件 起点在启动路径上,不在单篇内容里
第二次篡改 2026/6/24,首页文件 次日扩大到家目录入口
问题单创建 2026-06-25 从发生到被公开报告的间隔约一天
关闭 2026-07-08 公开到关闭约两周,中间是持续讨论

两条篡改日期相连,是这份问题单最有价值的信息:它说明写入动作不是一次性的,攻击者拿到了可持续改写文件的能力。排查如果只清理首页,第二天仍会重新出现。

篡改脚本为什么要判断访客身份

问题单里被写入的脚本读取访客标识与来源引用,用搜索引擎名称相关的关键词以及爬虫名称的正则模式来判断访问来源。目的很直接:让站长与正常访客看不到异常,只在爬虫访问时返回构造内容。

这带来两个排查上的后果。一是用浏览器打开首页往往显示正常,判断是否被篡改要换用与爬虫一致的访问方式;二是搜索引擎收录里出现的标题与描述可能与站内任何一份正文都不对应——这类「站里没有、外部却有」的差异,本身就是最直接的信号。

至于外部取回内容的具体地址与代码细节,问题单里已经写明,本文不复述混淆片段,也不引用外部域名。跟进时只需要接受一个结论:入口文件不是自己写的那份。

核对文件完整性的先后顺序

顺序按「被写入的可能性」排,不按目录层级排。

顺序 核对位置 判断方法
1 入口与启动文件 与发布包逐文件比对,包括文件修改时间
2 首页与栏目模板 比对模板原文,看是否多出读取访客信息的逻辑
3 上传目录内的脚本文件 素材目录里出现可执行扩展名即异常
4 定时与队列任务 检查是否存在非本人添加的任务
5 后台账号与登录记录 核对账号数量与近期登录来源
6 数据库内容 抽查正文与配置表是否被批量写入

第 1 步的比对基准来自发布包,而不是当前目录本身:当前目录里的文件已经被改过,拿它作基准永远一致。第 3 步是很多站点漏掉的一处——上传目录允许写入又要能被解析,是二次写入的常见落点。

部署方式决定恢复速度

同类事件里,恢复速度的差别通常不在技术上,而在有没有可退回的整份副本。

AnQiCMS 的备份与恢复支持数据与静态文件的备份和恢复,回退时把数据库与静态产物一并退回,避免模板退回、数据没退回造成的不一致。文档删除是移入回收站而不是物理删除,正文层面的误删与篡改可以先从回收站恢复,不必依赖备份整包。

部署方式在这里也起作用。AnQiCMS 支持宝塔面板一键部署、aaPanel、LNMP 命令部署与 Docker 镜像,默认监听 8001 端口。容器化部署时可以把整个运行环境退回上一镜像再重建,恢复面比只替换文件更完整;面板或命令部署时,比对与替换文件是主要手段,前提是有发布包原件可作基准。

改完之后还要验的几件事

清理与改密只完成一半,剩下的验证决定问题是否真的收住。

第一件是换一种访问方式复查:用与爬虫一致的访问方式抓取首页与几个内页,确认返回内容与站内正文一致。第二件是核对公开可见的结果,看收录里是否还残留异常标题。第三件是复核内容层,AnQiCMS 的内容安全设置提供敏感词过滤与关键词替换,并配套内容审核,这层检查能在篡改内容重新写入时把异常拦在对外发布之前。第四件是复盘写入路径——账号、版本、目录权限三项都要有结论,否则只清理文件等于等待下一轮。

常见问题

问题单里没写攻击来源,要不要自己推测?

不要。问题单只写明被改的文件与脚本行为,没有给出入侵路径。排查应当从账号、版本与文件权限三条可核对的线上找证据,推测来源会让处置动作失焦。

只恢复首页文件够吗?

不够。这份记录里两次篡改分别在入口启动文件与首页文件,两者相差一天。只清理被看到的那一个,另一个会在下次访问时重新产生异常。

怎么确认站点当前没有被写入类似逻辑?

用爬虫一致的访问方式抓首页与主要内页,与站内正文比对;同时把入口与启动文件同发布包原件比对。两者都一致,才能认为公开可见内容与站内内容相符。

恢复之后要不要改凭据?

要。文件被改写说明已存在写入能力,处置至少包括管理员口令更换与凭据轮换,再复核登录记录。只回滚文件、不改凭据的站点,下一轮清理还会重来。

相关文章

免密登录模块的信息泄露公告只评中等,泄露的是哪一类内容

一条针对二次验证与免密登录模块的公告,类别写作信息泄露,评级为中等关键、风险分值十二比二十五,维度串里机密性记为部分受影响、完整性记为零,利用条件标注为理论。本文按公告字段逐项拆解「中等」是从哪几个维度合成的,说明泄露类公告在没有公开细节时不该推断具体字段,并给出自有站点登录态与内容可见性的收口顺序。

2026-10-10

HTTP/2 的服务端推送被多数浏览器撤掉,首屏提前取资源靠什么

HTTP/2 的官方目标是用完整的请求与响应多路复用降低时延与队首阻塞,并用 HPACK 高效压缩首部字段;同版本引入的服务端推送因在实践中难以实现,已从多数主流浏览器引擎移除,替代手段是页面里的 rel=preload 声明与 103 Early Hints 状态码。本文说明这两种方式各自能提前到什么程度、首屏资源清单该怎么排,以及程序侧与网关侧各改哪一段,避免把优化押在一个已被撤掉的机制上。

2026-10-10

页面被别的网站嵌进 iframe 展示时,拦截写在哪个响应头

拦截被嵌套的页面有两层可选:X-Frame-Options 只剩 DENY 与 SAMEORIGIN 两个可靠取值,其中 ALLOW-FROM 已过时,现代浏览器遇到它会整条忽略这个响应头;要做更细的允许范围,需要用内容安全策略里的 frame-ancestors 指令。本文说明两条路各自的可用范围、为什么不能把过时取值当白名单,并按后台表单、留言、评论这三类可交互页面给出嵌入策略的选择顺序。

2026-10-10

有论文说 GEO 能把可见度提高约四成,站点上怎么复核这个数

生成式引擎优化那篇原始论文里被广泛引用的是一句上限口径:在基准测试环境下,GEO 手法可把可见度提升到约四成的增益,同时作者明确写到不同领域的效果差别很大。直接把这个数当成自家站点的预期收益是常见误读。本文拆解这个数字的实验设置,给出一套站内复核路径:固定基线与提问集、记录答案里的品牌与页面落点,再对上位站点能配合的模型说明文件与收录模块。

2026-10-10

编辑器模块连发越权公告,后台角色权限按什么口径收

编辑器模块的访问绕过公告评级为中等关键、风险分值十三比二十五,需要基本攻击条件并带有用户权限要求。本文按公告字段拆解越权类问题的读法,把收口口径落到动作分层:编辑、提交、发布三类动作分别归属不同用户组,先确认模块是否启用再收窄可执行范围,并用内容审核与敏感词过滤守住发布前的最后一道确认。

2026-10-10

同行程序的更新记录里写着切换 HTTPS 和屏蔽缓存投毒,算不算安全修复

同类程序的发布记录里同时出现三类改动:把模板外链由 http 改为 https、修复查询参数绕过导致的 HTML 缓存投毒、新增可信代理配置。三者都常被写成安全修复,但解决的层次不同。本文逐条区分传输加密、缓存正确性与访问控制,并给出升级前先做备份与回退准备的顺序,避免把版本记录读成安全承诺。

2026-10-10

接口返回 429 之后要等多久,重试提示该由哪一层给出

429 表示客户端在给定时间窗内请求过多,规范里这个响应可以带上重试提示头,说明客户端应当等待多久,文档示例给出的值是 3600 秒,也就是六十分钟之后可以再次请求。本文说明等待时长为什么应当由服务端给出、客户端只负责遵守,并区分按来源地址限流与按登录身份限流两种口径下推送接口与批量导入的不同写法。

2026-10-10

内容管理系统统计里 WordPress 占近六成,剩下的份额在谁手上

同一份内容管理系统统计里出现两个百分比:WordPress 被 40.1% 的网站使用,在内容管理系统口径下的份额为 58.6%;另有 31.6% 的网站使用的是统计方未监测到的内容管理系统。两者差别来自分母不同。本文说明这一档份额的读法、未监测部分意味着什么,以及选型时份额数据能回答与不能回答的问题。

2026-10-10