
核心要点(TL;DR)
- 先隔离再取证:立即备份现场并切断可疑写入路径,避免证据被覆盖。
- 篡改入口九成来自上传目录或弱口令后台,优先排查这两类路径。
- 用find按mtime筛出异常文件,比全量diff更快锁定被改文件。
- 防篡改核心是权限最小化+目录只读+完整性监控三件套。
站点首页突然变成黑帽跳转页、index.php 里多出一段陌生代码、搜索引擎提示“该页面可能被篡改”——这是运维和站长最不想看到的场景。慌乱中删文件、重启服务,往往把日志和内存马线索一起毁掉。本文按“先止血、再溯源、后加固”的顺序,给出可直接复制执行的命令与检查清单,帮你在最短时间内定位 Nginx 站点被篡改的入口,并落地一套可持续的防篡改配置。
一、先止血:隔离现场的三步操作
发现异常后不要立即删除文件或重启 Nginx,先固定证据:
- 打包备份站点目录:
tar czf /root/site-$(date +%F-%H%M).tgz /var/www,同时备份 Nginx 配置与日志目录。 - 记录当前进程与网络连接:
ps auxf、ss -antp,重点看是否有异常外连与陌生进程。 - 临时收紧写入:对上传目录执行
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/cache2. 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天历史版本,被篡改时可快速回滚。若使用云主机,开启快照与登录告警,能覆盖大部分常见入侵场景。