文章资讯 / 常见问题 / 网站被恶意跳转修复:检查index.php和.htaccess被植入跳转代码的处理

网站被恶意跳转修复:检查index.php和.htaccess被植入跳转代码的处理

发布时间: 分类:常见问题 作者:188mi 来源:互联网 阅读:98

网站被恶意跳转,先别急着重装系统:多数情况是 index.php 或 .htaccess 被塞进了跳转代码。按下面这份清单逐项排查,通常半小时内能定位并清干净。

排查清单 1:先分清跳转发生在哪一层

动手删文件之前,先判断跳转由什么条件触发。不同触发方式对应的排查方向完全不同。

  1. 只有手机访问跳、PC 正常——多半是模板或公共 JS 里做了 UA 判断,重点看 header.php、footer.php,以及全站引用的 JS 文件。
  2. 只在搜索引擎蜘蛛来访时跳——这是典型的 cloaking,服务端用 User-Agent 或 Referer 做判断,重点看 .htaccess。
  3. 所有访问都跳——大概率是入口 index.php 顶部被插入 header("Location: ..."),或者干脆被整文件替换。
  4. 只有首页跳、内页正常——优先查站点根目录的 index.php 和 .htaccess。

判断方法是用 curl 模拟不同来源,只看返回头,不要先看页面:

curl -I http://example.com/
curl -I -A "Baiduspider" http://example.com/

如果返回 301/302 且 Location 指向陌生域名,说明跳转在服务端完成;如果返回 200 但 HTML 里出现 window.location.href,问题就在 PHP 输出或模板层。

排查清单 2:找出所有被改动的文件

恶意代码很少只放一处。除了 index.php 和 .htaccess,常见落脚点还有 wp-config.php、functions.php、主题的 footer.php,以及被塞进上传目录的图片马。

按修改时间排序,比逐个打开文件快得多:

find /www/wwwroot/你的站点目录 -name "*.php" -mtime -30 -ls
ls -la /www/wwwroot/你的站点目录/
stat /www/wwwroot/你的站点目录/.htaccess

.htaccess 是隐藏文件。宝塔面板里的路径是:文件 → 选中站点目录 → 勾选“显示隐藏文件”;也可以在 SSH 里用 ls -la 直接看。

在 index.php 及相关文件里重点搜这些特征串:

grep -rn "eval\|base64_decode\|gzinflate\|str_rot13\|assert(" /www/wwwroot/你的站点目录 --include=*.php -l

排查清单 3:读懂 .htaccess 里的跳转写法

.htaccess 的恶意代码通常很短,藏在一堆正常规则中间,常见形态有三类:

  • 整站 301:RewriteRule ^(.*)$ http://陌生域名/$1 [R=301,L]
  • 按蜘蛛跳转:先 RewriteCond %{HTTP_USER_AGENT} (Baiduspider|Googlebot) [NC],再接一条 RewriteRule
  • 按来源跳转:RewriteCond %{HTTP_REFERER} (baidu|sogou) [NC] 后再跳

处理方式是把整段恶意的 RewriteCond / RewriteRule 删掉,而不是把整份 .htaccess 清空。清空前先备份一份,因为伪静态规则、301 规则通常也写在这里,删错会导致内页集体 404。

处理清单 4:清理顺序不能颠倒

清理有先后顺序,顺序错了恶意代码会被重新写回。

  1. 先改密码:后台管理员密码、FTP/SSH 密码、数据库密码全部更换,并检查有没有陌生的管理员账号。
  2. 再断开可疑入口:删除上传目录里的可疑 PHP 文件,检查是否存在陌生目录、陌生定时任务(crontab -l)。
  3. 然后清代码:删除 index.php、.htaccess、主题文件里的恶意片段,被替换的文件用备份直接覆盖更快。
  4. 最后改权限:目录 755、文件 644,.htaccess 设为 644。

如果 CMS 自带文件校验功能(WordPress 的“重新安装”、宝塔的文件校验等),优先用它比对,比人眼扫快得多。

加固清单 5:堵住被再次植入的入口

只清代码不修入口,通常几天内会被重新写回。重点做四件事:

  • 把 CMS 与插件升级到当前版本,老版本漏洞是最常见的入口。
  • 在 nginx 里禁止上传目录执行 PHP:location ~* /uploads/.*\.php$ { deny all; }
  • 关闭目录列表,在 .htaccess 里加一行 Options -Indexes。
  • 用 php.ini 的 disable_functions 关掉 eval、assert、system 等函数,改动前先确认站点程序是否依赖它们。

复检清单 6:清完之后怎么验证

清理完必须复检,否则不知道有没有清干净。把最开始那几条 curl 命令再跑一遍,确认返回头里没有陌生的 Location,页面源码里没有跳转脚本。

接着做三件事:

  1. 到百度搜索资源平台 → 抓取诊断,重新抓一次首页,看抓到的内容与真实页面是否一致。
  2. 查看服务器 access.log,筛出异常 POST 请求和陌生 IP 的访问频率。
  3. 保存一份干净文件的 md5 清单,之后定期比对,有变化就是又被写了。

搜索引擎端的恢复是滞后的。跳转代码清掉之后,快照和收录里可能还会残留一段时间,用收录查询工具盯几周,确认异常页面在逐步减少。

几个容易踩的坑

  • 只查 index.php 不查 .htaccess:有的案例是 .htaccess 干净、跳转在 PHP 里,反过来也有。
  • 用记事本改 .htaccess:Windows 记事本会写入 BOM,Apache 直接报 500。用面板自带编辑器或 vim。
  • 改完不留备份:下次再被入侵,没有干净备份会非常被动。
  • 只清首页:内页模板、评论文件、缓存目录都可能被写过,清理范围要按修改时间铺开看。

如果站点是站群或批量部署,建议把上面几步固化成同一套流程,每次异常按清单执行,避免漏项。

相关工具与阅读