Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

HTTPoxy - 我的 PHP 程序会受影响吗?

Solution Verified - Updated -

Environment

Red Hat Enterprise Linux 5.x
Red Hat Enterprise Linux 6.x
Red Hat Enterprise Linux 7.x
Red Hat Software Collections for Red Hat Enterprise Linux 6 and 7

Issue

如果您在所有使用 mod_php、CGI 或者 FastCG 的典型模式中使用 PHP,则会受此问题的影响。

PHP 的 getenv('HTTP_PROXY')$_SERVER['HTTP_PROXY'] 超级全局选项可提供 HTTP 请求的 Proxy 标头。

如果您的 PHP 脚本使用 getenv('HTTP_PROXY') 或者 $_SERVER['HTTP_PROXY'] 为后续的 HTTP 请求配置传出 HTTP 代理服务器,或者您的脚本在使用模块或库时暴露这个行为,比如 Guzzle,则可能让之后所有来自 PHP CGI 脚本的 HTTP 流量被重新指向攻击者控制的外部代理服务器。

注:PHP 的内置 curl扩展模块可提供与 libcurl库的绑定,这不是它自身的弱点,漏洞是由 PHP 库引入,并使用上述方法决定代理服务器使用。

请注意,只有在将受影响的 PHP 脚本部署到向 PHP 脚本提供传入 HTTP 请求 Proxy 标头内容的 HTTP 服务器中后,才会受这个问题的影响。

Resolution

红帽为 HTTP 服务器提供了更新及缓解操作指南,可防止其将 "Proxy" 标头内容作为 "HTTP_PROXY" 环境变量提供给 PHP 脚本。更新您的 HTTP 服务器或应用缓解操作可以关闭此向量,并防止有人利用此缺陷。

可采用以下方法之一防止使用攻击者提供的标头:

  • 配置网页应用程序防火墙,删除传入 HTTP 请求中的 "Proxy:" 标头。
  • 将您的 HTTP 服务器配置配置为主调用 PHP 脚本前删除 Proxy 标头。
  • 编辑 PHP 脚本使其在靠近顶端的位置,在 <?php 之后包含以下说明:

      putenv("HTTP_PROXY="); $_SERVER["HTTP_PROXY"] = "";
    

    如果在 Apache/mod_php 中运行 PHP,也要添加上述内容:

      apache_setenv('HTTP_PROXY', '');
    

Root Cause

详情请查看 HTTPoxy - CGI "HTTP_PROXY" 变量名冲突

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments