14 10 月 2026

某天打开自己网站,发现首页多了赌博广告、页面跳转到奇怪的地方、或者 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 = 大概率 webshell

3. 识别 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 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:SSH 安全加固进阶:从密钥登录到跳板机
  2. 下一篇:数据泄露应急响应与合规要点:出了事怎么按步走
发表评论 5