网站被挂马,最典型的开场是:搜索引擎提示「该网站可能被入侵」,或者访客说「点你的站会跳到别的地方」,或者你打开自己网站发现首页被加了几个陌生链接。多数人的第一反应是登进后台把陌生代码删掉,然后过两天它又回来了。
这篇文章讲清楚两件事:马是怎么进来的,以及怎么才能真正清干净。只删代码不查入口,永远是白干。
先搞明白:马从哪进来的
Typecho 和 WordPress 本身被直接打穿的漏洞不多,绝大多数入侵走的是这三条路:
1. 密码被爆破或泄露
后台密码是弱口令(admin、123456)、或者和别的网站用同一个密码被撞库。日志里会有一堆 POST /admin/login.php 或者 /wp-login.php 的失败记录。这类入侵最难看出来,因为攻击者用的是合法账号,从后台装插件、发文章,日志上一切正常。
2. 主题、插件里的后门
从论坛下的破解主题、网上找的「增强版插件」,这是重灾区。有些人会在主题的 functions.php 里塞一段看起来像正常功能的代码,实际可以远程加载任意文件。表现是:网站看起来正常,但服务器上莫名其妙多出文件、或者流量异常。
3. 老旧程序和已知漏洞
Typecho 用着几年前的版本,WordPress 装着两年没更新的插件。这类漏洞网上有公开的利用工具,扫描器一扫就能批量打。
清理流程:顺序错了等于没清
很多人第一步就是删文件,这是最错的一步。正确顺序是先取证、再断源、后清理。
第 1 步:先备份现场
把整个网站目录和数据库完整打包,存到本地。原因很实在:清理过程中你很可能删掉不该删的东西,或者清完还是有问题,需要回头比对。没有原始备份,后面所有判断都只能靠猜。
tar -czf /tmp/site-before.tar.gz /www/wwwroot/你的网站
mysqldump -u 用户名 -p 数据库名 > /tmp/db-before.sql第 2 步:找出最近被改动的文件
这是定位入口最有效的一招。后门文件的时间戳通常和你平时的发布时间对不上:
find /www/wwwroot/你的网站 -type f -mtime -30 -name "*.php" | head -50列出最近 30 天修改过的 PHP 文件,重点看这几类位置的陌生文件:
- 根目录下名字很随机的文件,比如
a1b2c3.php、wp-config-sample.php(被改过的假文件) usr/uploads/里出现.php文件——上传目录本来绝不该有可执行文件usr/themes/主题名/下多出来的文件,尤其是functions.php里末尾多出的代码.htaccess里多出的RewriteRule或php_value auto_prepend_file
auto_prepend_file 要特别注意,它能让一个被改过的 .htaccess 让所有 PHP 请求都先加载后门文件,你逐个删文件都删不干净。
第 3 步:断开入口
清理之前先切断攻击者再进来的路,否则你边清他边装:
- 改后台密码(换成 20 位随机)、改数据库密码、改 FTP/SSH 密码
- 数据库里删掉陌生的管理员账号,检查
typecho_users/wp_users - 检查是否有陌生插件被启用、陌生主题被装上
- 如果是 SSH 被爆破,先把密码登录关掉,改密钥
第 4 步:清理后门
按第 2 步列出来的清单逐个处理。几个判断技巧:
- 不要相信「看起来正常」。搜索
eval(、base64_decode(、assert(、gzinflate(、create_function(、$_POST[这些关键词,正常业务代码里极少出现组合用法 - 完整替换核心文件:
var/、admin/(Typecho)或wp-admin/、wp-includes/(WordPress)用官方原版覆盖一遍,这些目录你本来就没改过 - 主题和插件如果来源不明,最稳的做法是删掉重装,而不是修
grep -rn "eval(base64_decode" /www/wwwroot/你的网站 --include="*.php"
grep -rn "auto_prepend_file" /www/wwwroot/你的网站 --include=".htaccess"第 5 步:数据库也要查
马不只藏在文件里。文章正文、导航、主题设置(typecho_options 里的 theme:xxx)都可能被塞入脚本或隐藏链接。搜一下:
SELECT COUNT(*) FROM typecho_contents WHERE text LIKE '%<script%';
SELECT COUNT(*) FROM typecho_options WHERE value LIKE '%<iframe%';搜索结果里有陌生域名,就说明数据库被污染了。
第 6 步:加固,防止二次中招
清完不做加固,一个月内大概率复发。必做的几件事:
- 升级到最新版程序,删掉不用的主题和插件(未启用的旧插件同样是入口)
- 后台登录加限制:改登录路径、加验证码、限制 IP、失败次数锁定
- 上传目录禁止执行 PHP。Nginx 加一段:
location ~* ^/usr/uploads/.*\.(php|php5|phtml)$ {
deny all;
}- 关闭不必要的文件写入权限,目录 755、文件 644,只有
usr/uploads可写 - 开日志,保留至少 30 天,下次出事才有据可查
- 定期备份,并且备份文件不要放在网站目录里——这是最常见的失手点,备份被一起删掉就没救了
常见误区对照
| 做法 | 为什么不行 |
|---|---|
| 只删首页的跳转代码 | 跳转代码只是症状,后门文件还在,几小时后就恢复 |
| 直接重装程序、重新导入数据库 | 数据库里的污染和上传目录的后门会跟着回来 |
| 只改后台密码 | 后门是独立通道,不需要走后台登录 |
| 用扫描工具全盘扫一遍就放心 | 混淆过的后门能绕过大部分特征扫描 |
| 清理完不加固 | 入口没堵,同样的方式可以再来一次 |
什么时候值得找人处理
如果出现下面任何一种情况,建议别再自己删了:
- 清理完 24 小时内又被挂回去
- 找不到任何可疑文件,但站点仍然跳转
- 搜索引擎已经给出安全警告,收录开始掉
- 数据库被改乱,文章内容出现乱码或丢失
这几种情况通常是后门藏得比较深(.htaccess 加载、图片里嵌 PHP、定时任务留后门),或者已经被拖过数据。越早介入,能保住的东西越多——尤其是收录和排名,掉了之后恢复比修复本身更花时间。
挂马清理、白屏修复、搬家与安全加固的服务范围和报价,写在 服务与报价 页。越早介入,能保住的收录和排名越多。
本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。