某天发现后台多了一个不认识的账号,权限还是管理员。检查之后确认是被入侵了。这篇记录排查和清理的完整过程,希望别人不用再踩一遍。
怎么发现的
先是在服务器上看到一个奇怪的进程,路径在 /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 写回去。
清理动作
顺序很重要,先断外连再删文件:
- 把可疑文件移到隔离目录,不要直接删(留证据)
- 清掉恶意 cron 和自启项
- 删除异常管理员账号
- 改所有密码:WordPress 后台、数据库、SSH、面板
- 核对
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 -
最后修改:2023年4月8日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/archives/670
共有 0 条评论