防范nginx环境下的lfi攻击,关键在于不将nginx当作应用层执行器,而应聚焦阻断利用路径与加固协同环节:严格过滤路径参数、屏蔽敏感文件访问、切断rfi演进链路,并配合后端实现纵深防御。

防范 Nginx 环境下的非法文件包含攻击(LFI),关键在于**不把 Nginx 当作应用层执行器**——Nginx 本身不会解析 PHP、执行 include(),但它可能被用作代理或静态服务时,因后端配置不当、路径暴露或请求转发逻辑缺陷,间接促成 LFI 利用条件。因此防护需聚焦“阻断利用路径”和“加固协同环节”。
严格过滤用户可控的文件路径参数
LFI 多发于后端应用(如 PHP)动态包含文件时未校验输入。Nginx 虽不执行 PHP,但可通过以下方式提前拦截高危模式:
- 在 location 或 server 块中,用正则匹配并拒绝含目录遍历字符的请求参数: ```nginx if ($args ~* "(%2e%2e|\.\/|\.\.|..%2f|..\/)") { return 403; } ```
- 对常见包含入口(如
/page.php?file=、/index.php?view=)做精准拦截: ```nginx location ~* ^/.*\.php$ { if ($args ~* "(file|page|view|inc|load)=.*(\.\./|etc/passwd|/proc/self/environ)") { return 444; } } ``` - 避免在 Nginx 配置中使用
try_files或alias拼接用户输入(例如alias /var/www/$arg_path/;),这类写法极易导致路径穿越。
禁止访问敏感系统与配置文件
即使后端存在漏洞,若 Nginx 层直接阻止读取关键文件,也能大幅降低 LFI 实际危害:
- 全局屏蔽隐藏文件和系统路径: ```nginx location ~ /\.(git|htaccess|conf|log|ini|env)$ { deny all; } location ~* ^/(etc/|proc/|usr/local/etc/|var/log/) { deny all; } ```
- 限制 PHP 脚本仅能访问指定文档根目录,禁用
open_basedir绕过风险(该设置需在 PHP-FPM 的 pool 配置中启用,Nginx 配合传递正确SCRIPT_FILENAME)。 - 确保 Nginx 用户(如
www-data或nginx)对/etc/、/proc/等目录无读权限,从系统层面切断访问可能。
切断 LFI 向 RFI 和代码执行的演进路径
本地文件包含常是跳板,后续可能升级为远程包含(RFI)、日志注入、PHP 伪协议执行等。Nginx 可辅助阻断这些链路:
- 禁用危险协议处理:在 PHP 层关闭
allow_url_include = Off(Nginx 无法直接控制,但应纳入整体检查项); - 防止日志文件被包含:确保访问日志、错误日志不存于 Web 可访问路径,且 Nginx 日志格式中不记录恶意 UA 或 Referer(避免被写入后包含);
- 对上传目录严格隔离:单独配置
location /uploads/,禁止执行脚本(fastcgi_pass不命中)、禁用解析(types { } default_type text/plain;)。
配合后端与日志实现纵深防御
Nginx 是第一道网关,但不能替代应用层安全。必须与后端协同:
- 启用 Nginx 请求体大小限制(
client_max_body_size 1m;),防止超大 payload 注入日志或临时文件; - 开启详细访问日志,重点记录含
file=、../、php://、data://的请求,结合 Fail2Ban 自动封禁异常 IP; - 定期审计后端代码中的
include()、require()、file_get_contents()等调用,强制白名单路径映射,杜绝拼接用户输入。











