站点被入侵之后:一次完整的清理记录

米阳 2023-4-8 7 4/8

某天发现后台多了一个不认识的账号,权限还是管理员。检查之后确认是被入侵了。这篇记录排查和清理的完整过程,希望别人不用再踩一遍。

怎么发现的

先是在服务器上看到一个奇怪的进程,路径在 /tmp 下;然后是 WordPress 用户列表里多了一个名字很像管理员的账号(把 i 写成 l 那种)。

排查顺序

1. 找异常文件

find /www/wwwroot -name "*.php" -newermt "2023-03-01" -ls
grep -rl "eval(" /www/wwwroot --include="*.php" | head -20
grep -rl "base64_decode" /www/wwwroot --include="*.php" | head -20

找到三个可疑文件:一个伪装成缓存插件的目录,两个藏在 wp-content/uploads 里的 php 文件(正常上传目录不该有 php)。

2. 看混淆特征

其中一个文件内容是一长串十六进制加 base64,典型后门。这类文件通常会回连外部地址,也会自己重建被删的账号——所以只删文件不够。

3. 查登录记录

SELECT user_login, user_registered FROM wp_users ORDER BY user_registered DESC;
SELECT * FROM wp_options WHERE option_name LIKE '%last_login%';

再看 Nginx 访问日志里有没有大量 wp-login.php 的 POST,或者异常的 admin-ajax.php 请求。

4. 查定时任务和自启

crontab -l
ls -la /etc/cron.d/ /var/spool/cron/
cat /etc/rc.local
systemctl list-units --type=service | grep -v systemd

后门最爱藏在 cron 里,每隔几分钟把 webshell 写回去。

清理动作

顺序很重要,先断外连再删文件:

  1. 把可疑文件移到隔离目录,不要直接删(留证据)
  2. 清掉恶意 cron 和自启项
  3. 删除异常管理员账号
  4. 改所有密码:WordPress 后台、数据库、SSH、面板
  5. 核对 wp_posts 里有没有被插入垃圾内容(我这次发现了一条隐藏的赌博外链页面,用 left:-7566px 藏起来)

检查隐藏内容:

SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%display:none%' OR post_content LIKE '%left:-%';

加固

  • 后台强制强密码,限制登录尝试次数
  • wp-config.php 里加 define('DISALLOW_FILE_EDIT', true);,禁用后台改文件
  • 上传目录禁执行 php:
location ~* /wp-content/uploads/.*\.php$ { deny all; }
  • 插件主题全部升级到最新,删掉不用的
  • 数据库账号改成只读 + 最小权限,后台操作用独立账号

反思

入侵入口大概率是一个长期没升级的插件。这类事情的成本远高于升级的那点麻烦:清理花了两天,还要担心搜索引擎收录了垃圾页面、用户数据是否泄露。

现在的习惯是每周看一眼插件更新,每月改一次管理员密码,备份保留 30 天。

- THE END -

米阳

4月08日16:20

最后修改:2023年4月8日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论