
核心要点(TL;DR)
- 先清点版本、插件与主题,未知或停更组件一律下线,是收敛漏洞面的第一步。
- 后台路径改名、登录限速加双因素,可挡掉大部分弱口令爆破。
- 上传目录禁止执行PHP,是阻断Webshell落地最有效的一招。
- 每周用find与grep做一次文件完整性抽查,比事后应急更省成本。
很多站长把站点被挂马归咎于“运气差”,实际复盘下来,八成问题出在同一批地方:插件半年没更新、后台还用admin、上传目录能直接跑PHP、数据库账号是root。开源程序本身并不可怕,可怕的是默认配置加长期无人打理。本文面向要动手的运维和站长,按“清点—收敛—排查—加固”的顺序给出可复制命令和检查清单,照着做就能把WordPress/Discuz的漏洞面压到可控范围。
一、先清点:不知道装了什么,就谈不上加固
漏洞面收敛的第一步是资产清点。很多站点的插件目录里躺着三四年前装的组件,作者早已停更,这类组件就是公开漏洞的常客。
# WordPress 版本与组件清点
wp core version --allow-root
wp plugin list --fields=name,status,version,update --allow-root
wp theme list --fields=name,status,version --allow-root
# Discuz 版本
cat ./source/discuz_version.php | grep -i version
ls -la ./source/plugin/把结果整理成表,标注三类:在用且维护中、在用但停更、禁用但未删除。停更组件优先找替代品,确实离不开的,用WAF规则做虚拟补丁;禁用组件直接删目录,不要只点“停用”,因为停用状态下文件仍可被直接访问。
| 组件状态 | 处理方式 | 优先级 |
|---|---|---|
| 在用且持续更新 | 保持自动更新,订阅安全公告 | 低 |
| 在用但停更 | 替换或用WAF虚拟补丁 | 高 |
| 禁用未删除 | 直接删除目录与数据库残留表 | 中 |
二、收敛入口:后台、登录与文件权限
入口收敛的目标是让攻击者“找不到门、进不来、进来了也跑不动”。三件事按顺序做:
1. 后台路径与登录防护
WordPress可用插件改登录路径,也可在Nginx层做限制:
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
allow 203.0.113.0/24;
deny all;
}
location ^~ /wp-admin/ {
allow 203.0.113.0/24;
deny all;
}Discuz则建议修改后台入口文件名,并在config/config_global.php中开启登录失败锁定。无论哪种程序,管理员账号一律启用双因素认证,密码长度不低于16位。
2. 目录权限与执行策略
核心原则:Web进程只对必要目录有写权限,可写目录一律禁止执行脚本。
# 属主与权限基线
chown -R www-data:www-data /var/www/site
find /var/www/site -type d -exec chmod 755 {} \;
find /var/www/site -type f -exec chmod 644 {} \;
chmod 600 wp-config.php
# 上传目录禁执行(Nginx)
location ~* ^/wp-content/uploads/.*\.php$ { deny all; }同时检查是否存在残留的.user.ini、.htaccess,这类文件可改写执行配置,是绕过禁执行规则的常见手法。
三、排查:用命令找出可疑文件与后门
怀疑被入侵时,不要急着全站重装,先用命令缩小范围。以下排查按“时间—内容—权限”三个维度展开:
# 近7天被修改的PHP文件
find /var/www/site -name "*.php" -mtime -7 -type f
# 高危函数组合
# grep -rnE "(eval|assert|system|passthru|shell_exec)\s*\(" /var/www/site --include=*.php
grep -rn "base64_decode" /var/www/site --include=*.php | grep -i eval
# 异常权限文件
find /var/www/site -type f -perm -o+w
# 隐藏目录
find /var/www/site -name ".*" -type d命中结果先隔离到非Web目录再人工比对,不要直接删除,以免破坏取证线索。重点检查上传目录、缓存目录、wp-content下的随机命名文件,以及Discuz的data/、attachment/目录。确认后门后,还要检查数据库中的管理员账号是否被新增、计划任务是否被植入。
四、加固:数据库、配置与运行环境
程序层收敛完,还要堵住运行环境的短板:
- 数据库独立账号:为站点建专用账号,只授予当前库的增删改查权限,禁用FILE与SUPER权限。
- 配置文件保护:
wp-config.php、Discuz的config_global.php权限设为600,并禁止Web直接访问。 - 关闭危险函数:在php.ini中
disable_functions加入exec,system,passthru,shell_exec,popen,按业务实际需要取舍。 - 错误信息收敛:生产环境关闭
display_errors,避免泄露路径与版本。 - 备份与告警:数据库每日备份并异地留存,对文件变更、登录失败做告警。
如果希望减少手工维护成本,可借助AegisX的Web防护与主机安全能力,把上传目录禁执行、后台访问控制、Webshell特征检测做成统一策略,配合定期巡检报告,把上面这些检查项固化成常态。
五、检查清单:上线前逐项打勾
- 程序、插件、主题版本已清点,停更组件已替换或下线。
- 后台路径已改名,登录接口有限速,管理账号启用双因素。
- 目录权限符合755/644基线,配置文件600。
- 上传目录禁止执行PHP,无残留.user.ini/.htaccess。
- 数据库使用独立低权限账号,备份可恢复已验证。
- 危险函数已禁用,错误信息不外显。
- 已完成一次全站文件完整性抽查并留存基线。
行动建议:今天先做两件事——把后台登录路径改掉并启用双因素,把上传目录的执行权限关掉。这两步耗时不到一小时,却能挡掉大部分自动化攻击。之后按清单每周抽查一次文件变更,把加固从“一次性动作”变成“日常习惯”,站点被入侵的概率会显著下降。
常见问题(FAQ)
WordPress后台老是被爆破,有什么立竿见影的办法?
结论是先把登录入口收敛再谈密码强度。具体做法:用插件或Nginx将wp-login.php改名为随机路径,限制/wp-admin/仅允许办公IP访问,对登录接口做每分钟5次的限速并启用双因素认证。这样爆破流量在入口层就被挡掉,配合强密码与登录告警,基本可杜绝弱口令入侵。
Discuz站点发现可疑PHP文件,怎么确认是不是后门?
结论是看内容特征而非文件名。用find按修改时间筛出近期新增PHP文件,再用grep搜索eval、base64_decode、assert、system等高危函数组合,重点检查attachment、data、uc_server等可写目录。对命中文件先隔离到非Web目录,比对官方包哈希,确认后再删除并排查同批次文件。
上传目录已经禁止执行PHP,还需要做别的吗?
结论是需要,禁止执行只堵了直接访问这一条路。还应关闭目录列表、限制上传类型与大小、将上传目录放在Web根之外或用独立域名、对图片做二次渲染去除恶意载荷。同时检查是否残留.user.ini、.htaccess等可改写执行配置的文件,避免规则被绕过。
插件和主题多久更新一次比较合理?
结论是安全更新24小时内、功能更新按月。订阅官方与插件作者的安全公告,出现高危漏洞立即升级;常规版本先在测试环境验证再上生产。对停更超过一年的插件直接替换,无法替换的用WAF规则临时虚拟补丁,并记录在资产清单里定期复核。
小站没有安全团队,最低成本的加固顺序是什么?
结论是按入口、执行、数据三层推进。先改后台路径加双因素并限制访问IP;再收紧目录权限、上传目录禁执行、关闭危险函数;最后做数据库独立账号、定期备份并异地留存。三步完成后用漏扫工具复测,之后保持每周一次文件完整性抽查即可。