
先说句扎心的:大部分站长知道自己网站被黑,是通过别人告诉他的。要么是客户说"你们网站跳转到一个赌博页面了",要么是百度资源平台发邮件说"您的站点存在安全风险"。自己发现的反而是少数。
我去年帮人处理了十几起网站被黑的事,规模从个人博客到日IP过万的企业站都有。说句实在话——被黑不丢人,被黑了不知道才丢人。90%的情况其实能自己搞定,不需要找安全公司花大几千。这篇文章就是手把手带你处理,每一条命令都能直接复制粘贴用。
第一步:立即断网(但别关机)
发现异常第一反应是什么?很多人都想赶紧关机重启。千万别。关机等于毁灭现场证据,日志一丢你连谁干的什么时候干的都不知道。
正确做法是:先把Web服务停了,服务器该开机还开着。
Nginx用户:
systemctl stop nginx
Apache用户:
systemctl stop httpd
如果你用的是宝塔面板,直接在面板里把站点先停掉也行。目的都一样——让攻击者和普通用户都访问不到网站,但服务器上的文件、日志、进程一个都不丢。
停服之后不要急着删东西,也不要急着恢复。下一步你要搞清楚攻击者是怎么进来的,不然清了还会再进来。保留现场这一步,至少能帮你省掉50%的排查时间。
第二步:找出后门
攻击者进来之后基本上都会留后门——不然好不容易进来一次,你重启一下漏洞补了他就进不来了。后门通常藏在几个地方:最近被修改的PHP文件、奇怪的系统进程、计划任务里的恶意脚本。
先查最近7天被改过的PHP文件:
find /www/wwwroot/ -name "*.php" -mtime -7 -type f
输出会列出所有近7天内变动过的PHP文件。正常更新产生的修改你心里应该有数,那些不认识的、放在奇怪目录(比如uploads、cache、tmp)里的PHP文件,基本就是后门。
再补一条,专门找文件内容里有可疑代码的:
grep -rl "eval(" /www/wwwroot/ --include="*.php" | head -30
grep -rl "base64_decode" /www/wwwroot/ --include="*.php" | head -30
grep -rl "preg_replace.*\/e" /www/wwwroot/ --include="*.php" | head -30
eval()、base64_decode 和 preg_replace /e 模式是 webshell 的三大典型特征。不是说所有包含这些函数的都是后门——正常代码也会用到——但你得一个个文件打开看。看不懂内容的就是后门。
检查可疑进程:
ps aux | grep -E "php|python|perl|bash" | grep -v grep
重点看有没有以 www 用户身份运行的、CPU占用异常的、路径指向临时目录(/tmp、/dev/shm)的进程。如果看到 /tmp/something.php 或者 /dev/shm/xmrig 这种东西在跑——不用怀疑,已经被种了东西。
检查定时任务:
crontab -l
crontab -u www -l
cat /etc/crontab
ls /var/spool/cron/
攻击者经常用cron做持久化——你手动杀掉的恶意进程,定时任务到了又会自动跑起来。Web用户(www)的crontab是重灾区,很多站长根本没看过这个文件。
检查近期新增的文件:
find /www/wwwroot/ -type f -ctime -7 | sort
ctime查的是文件的元数据变更时间(创建、权限修改、重命名都算),能抓到那些攻击者改了时间戳但也改了权限的文件。
第三步:清理
找到后门之后,清理步骤别搞错顺序。很多人上来就删文件,删完发现第二天又被黑了,因为密码没改,攻击者用同样的方式又进来了。
正确顺序是:删后门 → 改密码 → 查新用户 → 清日志留底。
1. 删干净所有后门文件
# 先备份一份到安全位置(留证据)
mkdir -p /root/forensics_bak
cp -r /www/wwwroot/可疑文件目录 /root/forensics_bak/
# 再删除
rm -f /www/wwwroot/xxx/shell.php
删之前备份一份,不是为了复原——是为了事后分析攻击路径,避免下次再被同样的方式搞进来。
2. 重置所有密码
以下密码全部换掉,不要偷懒只改一个:
- SSH root密码
- 数据库密码(MySQL/MariaDB)
- 网站后台管理员密码(WordPress/Z-BlogPHP等)
- 宝塔面板登录密码
- FTP密码(如果有)
密码强度建议:16位以上,大小写字母+数字+特殊符号混用。别用"admin123"或者"公司名2026"这种——攻击者猜你密码的方式比你想象的聪明。
# Linux改root密码
passwd root
# MySQL/MariaDB改密码
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';"
3. 检查有没有新增的管理员账号
WordPress用户:
wp user list --role=administrator
或者直接查数据库:
mysql -e "SELECT ID,user_login,user_email,user_registered FROM wp_users;"
Z-BlogPHP用户查 zbp_member 表。系统用户查 /etc/passwd 和 /etc/shadow 最近有没有新增。
4. 保留入侵日志作为证据
cp /var/log/nginx/access.log /root/forensics_bak/
grep "POST.*php" /root/forensics_bak/access.log | tail -100
这些日志可以帮你还原攻击时间线和攻击手法。如果后续需要报警或者向主管汇报,这些都是证据。
第四步:加固
清理只是治标,加固才是治本。以下四项做完,再被同样方式攻击的概率能降80%以上。
1. 更新所有到最新版本
90%的入侵走的都是已知漏洞——不是0day,就是那些已经出了补丁但你还没打的漏洞。WordPress核心、插件、主题、PHP版本、服务器软件,全部更新到最新。
WordPress更新:
wp core update
wp plugin update --all
wp theme update --all
Z-BlogPHP直接在后台"应用中心"检查更新。PHP版本建议至少8.0以上,PHP 7系列已经停止安全支持。
2. 文件权限最小化
修改后的PHP文件不应该有可执行权限留给Web用户:
find /www/wwwroot/ -type f -name "*.php" -exec chmod 644 {} \;
find /www/wwwroot/ -type d -exec chmod 755 {} \;
chmod 600 /www/wwwroot/wp-config.php # WordPress配置
chmod 600 /www/wwwroot/zb_users/c_config.php # Z-Blog配置
上传目录(uploads)设置不允许执行PHP:
# Nginx location块加一行
location ~ /uploads/.*\.php$ { deny all; }
3. 安装安全插件
WordPress装WordFence或MalCare(免费版够用),开启防火墙规则和文件完整性监控。它能自动对比核心文件有没有被篡改,被改了一分钟之内就发邮件通知你。
Z-BlogPHP装官方安全插件,同样有文件校验和登录保护。
4. 关闭不用端口,配置防火墙
# 查看当前开放端口
netstat -tlnp
# 只保留 22(SSH), 80(HTTP), 443(HTTPS)
# 如果用宝塔,额外保留8888
# 其它的全部关掉
# UFW防火墙(如果不能装就用宝塔面板的安全→系统防火墙)
ufw default deny incoming
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable
MySQL的3306端口如果不需要远程访问,就不要开。Redis的6379同理。
第五步:恢复上线
确认以下四点之后再恢复Web服务:
- 后门文件全部删除
- 密码全部换过
- 系统和程序都已更新
- 安全插件已激活并完成首次扫描
恢复命令:
systemctl start nginx
# 或者
systemctl start httpd
恢复后先自己打开网站每个页面点一遍,确认没有被篡改、没有异常跳转、没有弹窗。
如果百度已经给你的站点打了"风险"标签,去百度资源平台提交安全审查:
百度资源平台 → 站点管理 → 安全检测 → 申请重新审核
Google的类似,在Google Search Console → 安全问题 → 申请审核。一般1-3个工作日恢复。
最后,如果你的网站有用户注册功能、存了用户数据,建议给所有用户发一封邮件通知他们修改密码。虽然有点麻烦,但这是负责任的做法。比被用户自己发现后找过来强得多。
预防:别等再次被黑才想起来
写几条我自己的日常操作,不花时间但能挡掉大多数攻击:
每周自动备份:数据库+网站文件打包存到异地(阿里云OSS、七牛、又拍云都行,一个月几块钱)。出事了直接回滚,五分钟恢复。
开启自动更新:WordPress在wp-config.php里加 define('WP_AUTO_UPDATE_CORE', true);。插件和主题也建议自动更新——被更新搞出问题的概率远小于被打旧漏洞搞死的概率。
定期扫描:每周跑一次 find /www/wwwroot/ -name "*.php" -mtime -7,看有没有陌生的PHP文件出现。养成习惯之后,一个命令三秒钟的事。
登录防护:SSH改密钥登录,关掉密码登录。后台管理地址加IP白名单或者HTTP基本认证。这两个改动能挡掉99%的暴力破解。
说到底,网站安全不是什么高深技术。就是日常备份 + 及时更新 + 定期扫一眼三件事。做到这三条,大部分攻击进来都翻不了天。
被黑不可怕,不知道被黑了才可怕。今天就开始做第一次备份吧。
还木有评论哦,快来抢沙发吧~