某天打开自己网站,发现首页多了赌博广告、页面跳转到奇怪的地方、或者 Google/百度提示「网站含有恶意内容」——这就是被挂马了。
挂马不一定是黑客炫技,多半是你的网站被当成了钓鱼/博彩的跳板,用来骗你的访客。这篇讲怎么排查、怎么清除、怎么防复发。
需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏快速部署。
一、挂马的常见形式
| 形式 | 表现 | 藏身地 |
|---|---|---|
| 暗链 | 页面底部藏着赌博/色情链接(访客看不见) | 模板文件、数据库 |
| 跳转 | 访问首页 302 到博彩站 | index.php、.htaccess、JS |
| 注入广告 | 页面弹出广告、飘窗 | 公共 JS、主题文件 |
| webshell | 攻击者留的后门文件,随时再进来 | 上传目录、主题目录 |
| SEO 劫持 | 搜索引擎抓取时看到博彩内容,用户看到正常页面 | 判断 UA 的代码 |
| 仿冒页面 | 网站根目录多了 login.html 等钓鱼页 | 站点目录 |
共同特征:正常用户看不到,但搜索引擎或特定条件(手机 UA、半夜时段)才触发。
二、排查:先找到马在哪
1. 确认现象
# 用命令行看页面(不带 UA,像爬虫一样)
curl -s https://你的域名/ | grep -iE "casino|betting|彩票|sex|viagra|href=\"http" | head -20
# 对比: 带正常浏览器 UA 看
curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://你的域名/ | grep -iE "casino|betting" | head
# 两者不一致 = SEO 劫持(判断 UA 注入)2. 找最近被改的文件
# 网站目录下,最近 7 天修改的 PHP 文件
find /var/www/html -name "*.php" -mtime -7 -ls
# 重点排查这几个位置
find /var/www/html -name "*.php" -mtime -30 -newer /var/www/html/index.php
# 单个可疑文件(比如不在正常目录的 php)
find /var/www/html -path "*/uploads/*.php" # 上传目录有 PHP = 大概率 webshell3. 识别 webshell
# 常见 webshell 特征: eval、assert、system、base64_decode
grep -rlE "eval\(|assert\(|base64_decode\(|gzuncompress\(|str_rot13\(" /var/www/html --include="*.php" | head -20
# 冰蝎/哥斯拉(中国菜刀类) webshell 特征
grep -rlE "eval\(\$_POST|assert\(\$_POST|\$_POST\[.*\]\(" /var/www/html --include="*.php"
# 文件名可疑的(随机字符、伪装图片)
find /var/www/html -name "*.php.jpg" -o -name "*.gif.php" -o -name "[a-z0-9]\{16,\}.php"4. 数据库排查
# 暗链常藏在数据库(文章内容、设置项)
mysql -u root -p 数据库名 -e "
SELECT * FROM wp_posts WHERE post_content LIKE '%casino%' OR post_content LIKE '%<iframe%';
SELECT * FROM wp_options WHERE option_value LIKE '%<script%' OR option_value LIKE '%casino%';
"
# Typecho 同理查 contents 表和 options/fields 表5. 日志溯源(怎么进来的)
# 找可疑的 POST 请求(上传 webshell、利用漏洞)
grep "POST" /var/log/nginx/access.log | grep -vE "wp-login|xmlrpc" | tail -50
# 找上传接口的可疑访问
grep -E "upload|editor|file" /var/log/nginx/access.log | grep POST | tail -30
# 看请求来源 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10三、清除:三步走
1. 止血(先断外网)
# 方式一: 安全组只放行自己的 IP(控制台操作)
# 方式二: Nginx 返回维护页
server {
listen 80;
return 503; # 全部请求返回维护中
}
systemctl reload nginx别急着删文件——先备份证据(日志、可疑文件),后面溯源和报警要用。
2. 清除(按找到的位置)
# a. 删 webshell 和可疑文件
# 先备份到 /root/evidence/
mkdir -p /root/evidence
cp 可疑文件 /root/evidence/
rm 可疑文件
# b. 清理被注入的内容(文件)
# 用干净版本覆盖: 重新下载官方包,对比覆盖
# 而不是手工删行(容易删不干净)
# c. 清理数据库暗链
mysql -u root -p 数据库名 -e "
UPDATE wp_posts SET post_content = REPLACE(post_content, '注入的代码', '');
DELETE FROM wp_options WHERE option_value LIKE '%casino%';
"
# d. 检查定时任务(持久化后门)
crontab -l
ls /etc/cron.d/
grep -r "curl\|wget" /etc/cron.d/ /var/spool/cron/3. 换干净环境(最稳)
如果 webshell 藏得深、时间久、不确定清干净没有:
# 1. 导出数据库,清理后重新导入新库(过滤注入内容)
# 2. 网站文件用官方原版覆盖
# 3. 主题/插件只保留必要的,全部用官方最新版
# 4. 改所有密码: 后台、数据库、FTP、面板
# 5. 极端情况(服务器被 root 入侵): 重装系统判断标准:拿不准有没有清干净 → 重装/覆盖。时间成本比重跑一遍低。
四、溯源:攻击者怎么进来的
挂马只是结果,入口才是根因。常见入口:
| 入口 | 检查方法 |
|---|---|
| 程序/插件漏洞 | 看版本,对比官方更新日志 |
| 弱口令后台 | 看登录日志有无暴力破解成功 |
| 文件上传漏洞 | 上传目录有 PHP、日志有可疑 POST |
| 主题/插件后门 | 非官方渠道下载的破解主题 |
| 服务器其他服务沦陷 | Redis 未授权、其他站点被拖累 |
| FTP/面板凭证泄露 | 登录记录、密码是否复用 |
# 后台登录日志(WordPress 例子)
grep "wp-login.php" /var/log/nginx/access.log | grep "200" | tail -30
# 检查是否有登录成功记录(暴力破解得手的标志)
grep "POST /wp-login.php" /var/log/nginx/access.log | awk '{print $1, $4}' | uniq -c | sort -rn | head五、防复发:加固清单
清完不算完,不加攻还会再来。按这个清单加固:
程序层:
- [ ] WordPress/Typecho 核心更新到最新版
- [ ] 所有插件、主题更新,删掉不用的(尤其是来源不明的破解主题)
- [ ] 后台密码强密码,别用 admin 用户名
- [ ] 装登录限制插件(fail2ban + WordPress 登录保护)
服务器层:
- [ ] 上传目录禁止执行 PHP(Nginx 配置)
- [ ] 装 WAF(雷池或 ModSecurity)拦截注入和上传攻击
- [ ] 文件权限:目录 755、文件 644,不属于 www 的一律收紧
- [ ] SSH 密钥登录、禁密码
- [ ] 关闭不用的端口和服务
监控层:
- [ ] 文件完整性监控(对比官方哈希)
- [ ] 每日巡检看新文件
- [ ] 百度/Google Search Console 绑站,安全提示第一时间知道
文件完整性监控脚本:
#!/bin/bash
# 每日对比网站文件变化
WEB="/var/www/html"
BASE="/opt/scripts/file-baseline.txt"
find "$WEB" -type f -name "*.php" | sort | xargs md5sum > /tmp/file-now.txt
if [ -f "$BASE" ]; then
diff "$BASE" /tmp/file-now.txt | grep "^[<>]" | head -50 | \
mail -s "网站文件变化告警" admin@example.com
fi
cp /tmp/file-now.txt "$BASE"# 上传目录禁 PHP(Nginx)
location ^~ /wp-content/uploads/ {
location ~ \.php$ { deny all; }
}六、被搜索引擎标记了怎么办
被百度/Google 标注「不安全网站」,清除后要申请恢复:
百度:ziyuan.baidu.com → 站点管理 → 官网保护/安全检测,提交申诉
Google:Search Console → 安全问题 → 验证已修复 → 请求审核
审核周期:百度几天,Google 几天到两周。期间排名受影响,所以防患比善后重要。
七、常见问题
Q:网站打开正常,但百度快照显示博彩内容?
典型 SEO 劫持——代码判断 UA,爬虫看到的和用户看到的不一样。用 curl 不带 UA 抓自己的页面对比,找到判断 UA 的代码删掉。
Q:找不到可疑文件,但首页确实有暗链?
在数据库里。文章内容、设置项、小工具都可能被注入。用 SQL 搜 <a href="http 且不在自己域名下的外链。
Q:清完了,过几天又出现?
webshell 没清干净(可能藏在不显眼的目录),或者入口没堵。用「官方原版全量覆盖」重来一次,比零敲碎打可靠。
Q:虚拟主机/子目录被挂马会影响整台服务器吗?
看权限隔离。同用户下的站点会互相影响;Nginx + PHP-FPM 按站点分用户能隔离。这也是推荐自己配环境的原因。
Q:需要报警吗?
造成实际损失(数据泄露、诈骗得手)可以报警,保留证据(日志、文件、时间线)。个人小站一般自认倒霉清干净算了,但取证动作要做(备份证据再清理)。
Q:怎么知道自己的网站有没有被挂马?
三个免费监控:百度站长平台安全检测、Google Search Console 安全问题、Sucuri/腾讯网址安全中心扫描。每周看一眼。
小结
挂马处置四步:断网止血 → 备份证据 → 全量清除(官方原版覆盖最稳)→ 溯源堵洞。之后按加固清单防复发,重点是「上传目录禁 PHP + WAF + 程序更新」三件套。网站安全没有一劳永逸,每周巡检 + 文件监控是常态。
更多安全内容见财富云计算知识库:WAF 实战、漏洞防护、应急排查、安全基线全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]clamdscan -i /var/www扫到 PUA.Win32.Trojan 之类的先别慌,看文件路径和内容确认——游戏 MOD、破解工具常被误报。真 webshell 长这样:混淆的 PHP、藏在图片目录的 php、名字随机。排查手法见网站被挂马排查清除与防护。五、auditd:谁动了什么AIDE 告诉你「文件变了」,auditd 告诉你「谁改的」:sudo apt-get install [...]
2026-10-15 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复
[...]└─ 联系我们 ← 电话、地址、表单、地图文案的常见错误:满屏"引领行业、卓越品质"这种空话。客户只关心"你能解决我什么问题、多少钱、靠不靠谱"。五、性能与安全:上线前 checklist性能(官网打开超过 3 秒,一半访客流失):开页面缓存,动态页面静态化,见PHP-FPM 安装与性能调优图片压缩 + WebP,方法论见网站图片与静态资源优化上 CDN,静态资源走 CDN,见CDN 加速配置[...]
2026-10-18 回复
[...]个人中心(订单 / 地址 / 优惠券)四、接支付:最需要谨慎的一步国内自建电商的支付选项:方式资质要求费率说明微信支付企业主体 + 商户号约 0.6% 起需对接口,或用插件支付宝企业/个体户约 0.6% 起同上个人码收款无0仅限小额/熟人场景,风控严PayPal企业主体约 3.9%+做海外用硬性要求:企业主体才能申请微信/支付宝商户号,个人主体基本没戏——注册主体时想清楚全站 HTTPS 是强制的[...]
2026-10-18 回复
[...]}4. 初始化:访问域名 → 环境检查 → 填数据库 → 设管理员。进后台第一件事:关闭游客上传(除非你就是做公共图床,那先想清楚合规问题)配存储策略:本地 + 对象存储双策略,大的走对象存储开启图片处理:压缩 + WebP 转换 + 缩略图三、存储策略:本地 vs 对象存储图床的图片只增不减,硬盘迟早爆。Lsky Pro 支持多存储策略,正确姿势是:图片类型存哪理由小图(< 200KB)本[...]
2026-10-18 回复