Nginx站点被篡改怎么查?入口定位与防篡改配置实战 核心要点图解,先隔离再取证:立即备份现场并切断可疑写入路径,避免证据被覆盖。;篡改入口九成来自上传目录或弱口令后台,优先排查这两类路径。;用find按mtime筛出异常文件,比全量diff更快锁定被改文件。;防篡改核心是权限最小化+目录只读+完整性监控三件套。
Nginx站点被篡改怎么查?入口定位与防篡改配置实战 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • 先隔离再取证:立即备份现场并切断可疑写入路径,避免证据被覆盖。
  • 篡改入口九成来自上传目录或弱口令后台,优先排查这两类路径。
  • 用find按mtime筛出异常文件,比全量diff更快锁定被改文件。
  • 防篡改核心是权限最小化+目录只读+完整性监控三件套。

站点首页突然变成黑帽跳转页、index.php 里多出一段陌生代码、搜索引擎提示“该页面可能被篡改”——这是运维和站长最不想看到的场景。慌乱中删文件、重启服务,往往把日志和内存马线索一起毁掉。本文按“先止血、再溯源、后加固”的顺序,给出可直接复制执行的命令与检查清单,帮你在最短时间内定位 Nginx 站点被篡改的入口,并落地一套可持续的防篡改配置。

一、先止血:隔离现场的三步操作

发现异常后不要立即删除文件或重启 Nginx,先固定证据:

  1. 打包备份站点目录:tar czf /root/site-$(date +%F-%H%M).tgz /var/www,同时备份 Nginx 配置与日志目录。
  2. 记录当前进程与网络连接:ps auxf、ss -antp,重点看是否有异常外连与陌生进程。
  3. 临时收紧写入:对上传目录执行 chmod -R a-x /var/www/html/uploads,去掉执行位,阻断 Webshell 继续运行。

完成备份后再改密码、封 IP、下线被篡改页面,避免证据链断裂。

二、定位被改文件:用时间线代替全量比对

全站 diff 在几十万文件时非常慢,优先用修改时间筛选:

find /var/www -type f -newermt '2024-06-01' -ls | head -100
find /var/www -type f \( -name '*.php' -o -name '*.jsp' \) -mtime -7 -ls

再叠加内容特征扫描:

grep -rIl --include='*.php' -E 'eval\(|base64_decode\(|assert\(|system\(|passthru\(' /var/www

重点关注上传目录、缓存目录、模板目录和站点根目录下突然出现的 .php、.jsp、.htaccess 文件。若站点有 Git 或发布包,用 diff -r 对比原始版本最准确。

三、溯源入口:从 access.log 反查攻击路径

篡改通常伴随一次成功上传或文件包含,Nginx 访问日志是第一手线索。

1. 统计高频 POST 与上传接口

awk '~/POST/{print ,}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -50

重点看 upload.php、admin、editor 等路径,以及参数异常冗长的请求。

2. 筛选可疑状态码与 UA

grep -E ' 200 ' /var/log/nginx/access.log | grep -Ei 'eval|base64|\.\./' | head -30
grep -Ei 'sqlmap|nikto|acunetix|curl' /var/log/nginx/access.log | head -20

3. 关联 error.log

PHP 的 Warning: include()、failed to open stream 往往直接指向被利用的文件包含点。把 error.log 时间与文件修改时间对齐,基本能锁定入口脚本。

经验判断:九成以上的站点篡改入口集中在“上传功能未校验类型”“后台弱口令”“第三方插件已知漏洞”三类,排查优先级按此排列。

四、分步加固:Nginx 与文件系统防篡改配置

1. 权限最小化

chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 750 {} \;
find /var/www/html -type f -exec chmod 640 {} \;
chmod -R a-x /var/www/html/uploads /var/www/html/cache

2. Nginx 配置做减法

server_tokens off;
location ~* /\.(git|svn|env) { deny all; }
location ^~ /uploads/ {
    location ~* \.(php|jsp|sh)$ { deny all; }
}

同时关闭 autoindex on,对后台路径加 IP 白名单与 basic auth 双重限制。

3. 只读与不可变属性

静态资源目录可只读挂载;核心配置文件用 chattr +i 防止被改写,修改前先 chattr -i。

4. 完整性监控

建立哈希基线并每日比对:find /var/www -type f -exec sha256sum {} \; > /root/baseline.sha256,配合 cron 定时 diff 告警。若希望减少自研成本,可在这一层引入 AegisX 的文件完整性监控与 Web 目录防篡改能力,实现变更实时告警与一键回滚。

加固项作用优先级
上传目录去执行位阻断 Webshell 运行高
Nginx 禁用危险后缀减少解析攻击面高
哈希基线比对发现未知篡改中
chattr +i防配置被改写中

五、收尾检查清单

  • 被篡改文件已备份并确认来源;
  • Webshell 已清除,且上传目录无残留可执行文件;
  • 后台与数据库密码已更换,SSH 关闭密码登录;
  • Nginx 配置已重载并验证 nginx -t 通过;
  • 完整性监控与异地备份已生效。

行动建议:把上述命令整理成一份应急脚本,平时每月演练一次;防篡改不是一次性配置,而是“权限收紧 + 变更监控 + 快速回滚”的持续过程。先完成上传目录去执行位和日志留存这两件成本最低的事,就能挡掉大部分常见篡改路径。

常见问题(FAQ)

Nginx站点被篡改,第一步应该做什么?

结论:先保全现场再处置。立即对站点目录做快照或打包备份(tar czf /tmp/site-$(date +%F).tgz /var/www),同时记录当前时间、可疑文件列表与Nginx访问日志。不要急着删除被篡改文件,也不要重启服务,否则内存马、临时文件与日志线索可能丢失。备份完成后再切断上传目录执行权限、修改后台密码,逐步收敛攻击面。

怎么快速找出哪些文件被篡改了?

结论:用时间线筛选最快。执行find /var/www -type f -newermt '2024-01-01' -ls按修改时间列出近期变动文件,重点看上传目录、模板目录和根目录下的php/jsp文件。再配合grep -rIl 'eval\|base64_decode\|assert('定位可疑代码。若站点有版本库或发布包,用diff -r对比原始版本最准确。生产环境建议提前部署文件哈希基线,事后比对效率最高。

如何从Nginx日志定位入侵入口?

结论:从异常POST与高频404反查。用awk统计access.log中POST请求:awk '~/POST/{print ,}' access.log | sort | uniq -c | sort -rn | head -50,重点看上传接口和admin路径。再筛状态码200但URL含.php/.jsp且参数冗长的请求。结合error.log中的PHP Warning与文件包含报错,往往能直接定位到被利用的脚本与上传点。

Nginx层面怎么做防篡改配置?

结论:用权限与只读挂载兜底,Nginx配置做减法。站点目录属主设为运行用户、权限750,上传目录去掉执行位(chmod -R a-x uploads)。Nginx中禁用不必要的HTTP方法,对上传目录location限制仅GET/POST,关闭autoindex,隐藏版本号server_tokens off。更彻底的做法是把静态资源目录以只读方式挂载或使用不可变属性chattr +i,配合AegisX的文件完整性监控实现变更告警。

没有专业安全设备,个人站长怎么持续防篡改?

结论:靠定时任务+哈希基线即可低成本覆盖。写一个cron脚本每天对站点目录生成sha256清单并与基线比对,发现差异邮件告警;同时用inotifywait监控上传目录的写入事件。定期备份到异地,并保留至少7天历史版本,被篡改时可快速回滚。若使用云主机,开启快照与登录告警,能覆盖大部分常见入侵场景。