
最近一家部署在香港的数据服务提供商报告,其一台公网暴露的Web服务器遭遇了持续的目录遍历攻击。攻击者通过构造恶意URL,试图访问服务器中未授权的敏感文件,导致Web服务异常波动,部分用户反馈页面加载缓慢甚至访问失败。
这台服务器运行的是基于Nginx + PHP-FPM的LNMP架构,承载了多个业务系统。攻击行为持续约48小时,未造成明显数据泄露,但存在严重安全隐患。
问题初现与初步排查
1. 异常日志分析
管理员首先通过分析/var/log/nginx/access.log和/var/log/nginx/error.log发现了大量可疑请求,具有如下特征:
GET /../../../../../../../etc/passwd HTTP/1.1
GET /%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1
GET /index.php?page=../../../../wp-config.php HTTP/1.1
这些请求典型特征为目录遍历攻击,攻击者试图跳出Web根目录读取系统敏感文件。
2. 系统资源监控
通过top和htop命令监控,发现PHP-FPM进程持续占用CPU资源高达80%以上,内存飙升至3GB以上。Web服务响应明显变慢。
3. Web根目录权限检查
检查Web目录权限配置,发现部分目录权限设置为777,存在任意用户可写的高风险行为。
漏洞根因分析
1. Nginx配置缺陷
香港服务器的nginx.conf未对非法路径访问进行有效过滤,相关location配置如下:
location / {
root /var/www/html;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
这个配置未对路径中的“../”等非法字符做过滤或拒绝,导致目录遍历成为可能。
2. PHP参数配置不严
php.ini中的相关参数未做安全加固:
allow_url_include = On
open_basedir = (未设置)
allow_url_include=On 允许PHP文件包含远程资源,带来远程代码执行风险;
未设置open_basedir限制PHP脚本访问目录范围,使得攻击者可以尝试访问系统任意路径。
防护策略与实操强化
1. Nginx配置加固
a) 禁止目录遍历路径
通过正则过滤非法路径访问请求:
location ~ (\.\.\/) {
deny all;
return 403;
}
b) 拒绝尝试访问敏感文件
加入敏感文件访问拦截:
location ~* /(\.ht|\.git|config\.php|\.env) {
deny all;
}
c) 加强访问控制
对PHP文件的处理进行精细化控制,限制动态文件解析目录:
location ~ \.php$ {
root /var/www/html;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include snippets/fastcgi-php.conf;
}
2. PHP配置强化
修改php.ini或对应站点的自定义ini文件,推荐如下设置:
expose_php = Off
display_errors = Off
allow_url_include = Off
allow_url_fopen = Off
open_basedir = /var/www/html/:/tmp/
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
通过open_basedir限制PHP的访问范围仅限/var/www/html与/tmp,杜绝越权访问系统目录的可能。
3. 文件权限重构
对Web目录的权限重新调整:
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
移除多余写权限,确保PHP无法修改或执行非必要文件。
4. Web应用防火墙部署
引入ModSecurity或使用OpenResty结合Lua脚本实现目录遍历行为的实时拦截。例如配置检测../或URL编码后的遍历尝试:
if ($request_uri ~* "(\.\./|\%2e\%2e)") {
return 403;
}
5. 日志审计与告警
通过Fail2ban或自定义脚本监控Nginx日志中的目录遍历行为,实时阻断可疑IP:
fail2ban-client set nginx-http-auth banip 192.168.1.100
或使用以下命令配合cron进行监控:
grep -E "\.\./|\%2e\%2e" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c
整改效果验证
- 实施以上防护措施后,服务器负载恢复正常;
- 攻击者请求命中403响应码,尝试进一步访问被拦截;
- 安全审计工具未再发现敏感文件外泄风险。
通过WAF拦截日志对比:

攻击趋势明显下降,系统运行趋于稳定。
此次事件暴露出Web服务在Nginx与PHP配置层面存在典型的安全松懈问题。目录遍历虽属传统攻击方式,但在配置不当的场景下依然极具破坏性。
建议企业:
- 部署前进行安全基线加固;
- 定期安全审计和渗透测试;
- 对Nginx与PHP的每一项配置进行逐条审核;
- 实现日志自动化分析与告警机制;
- 引入轻量级WAF提升实时防御能力。
只有将“预防、检测、响应”形成闭环,才能从根本上提高Web服务在公网环境下的安全性。











