如何修复Httpoxy在Linux或Unix上的CGI PHP/Nginx/Apache/Go应用程序漏洞

时间:2020-01-09 10:38:25  来源:igfitidea点击:

在使用PHP,Go,Python和其他脚本语言的Linux或Unix如何使用CGI脚本时,发现了一个严重漏洞。
如何在Linux或Unix上针对Httpoxy修复HAProxy,Varnish,Nginx,PHP,Go,Python,Tomcat等的CGI应用程序漏洞?

httpoxy是一组漏洞,影响在CGI或类似CGI的环境中运行的应用程序代码。
它归结为一个简单的名称空间冲突:

  • RFC 3875(CGI)将请求中的HTTP代理标头作为HTTP_PROXY放入环境变量中
  • HTTP_PROXY是一个流行的环境变量,用于配置传出代理

这导致可远程利用的漏洞。
如果您运行的是PHP或CGI,则应阻止Proxy标头。
该攻击使用HTTP_PROXY进行中间人攻击。
以下Web服务器,Web框架和编程语言会受到影响:

  • Go(CVE-2016-5386)
  • PHP语言(CVE-2016-5385)
  • HHVM(CVE-2016-1000109)
  • Python(CVE-2016-1000110)
  • Apache Tomcat(CVE-2016-5388)
  • Apache服务器(CVE-2016-5387)/Nginx/Varnish/Httpoxy。
  • Disro RHEL和CentOS等。

修补您的操作系统和应用程序

首先为您的操作系统和应用程序软件(例如Apache,PHP,Nginx等)安装所有可用的更新:

$ sudo apt-get update && sudo apt-get upgrade

或者

$ sudo dnf update

或者

$ sudo yum update

Nginx代理服务器的Httpoxy缓解

编辑您的nginx.conf或fastcgi_params文件:

# vi /etc/nginx/ fastcgi_params

添加以下指令:

fastcgi_param  HTTP_PROXY  "";

在将HTTP请求代理到上游应用程序时,明智的做法是将任何Proxy标头设置为空字符串,以防上游应用程序在易受攻击的平台上运行(在负载平衡和代理HTTP流量时添加在nginx.confs中):

proxy_set_header Proxy "";

保存并关闭文件。
重新加载/重启nginx服务器:

# systemctl reload nginx

Apache服务器的Httpoxy缓解

您可以使用mod_headers。
编辑/etc/httpd/conf.d/site.conf或httpd.conf:

# vi /etc/httpd/conf.d/site.conf

添加以下指令:

RequestHeader unset Proxy

保存并关闭文件。
重新启动apache服务器:

# systemctl restart httpd

http-请求del-header代理

使用HAProxy缓解Httpoxy

编辑/etc/haproxy/haproxy.cfg并按如下所示进行编辑/追加以删除代理标头:

http-request del-header Proxy

重新启动Httpoxy:

# systemctl restart haproxy

使用Varnish的Httpoxy缓解

编辑/etc/varnish/default.vcl并按如下所示进行编辑/添加以删除Proxy标头(找到并添加子vcl_recv {}部分):

unset req.http.proxy;

保存并关闭文件。
重新启动清漆:

# systemctl restart varnish

适用于PHP/Go lang CGI应用程序的Httpoxy缓解

您需要配置Web应用程序防火墙(例如Nginx),以从传入的HTTP请求中删除Proxy标头。
有关Nginx和Apache代理的特定信息,请参见上文。

通过编辑.php文件来修复您的php应用程序

编辑您的PHP文件,并确保他在<?
php之后靠近顶部的以下语句:

<?php
/* Warning: Not tested and may not be effective */
putenv("HTTP_PROXY="); $_SERVER[HTTP_PROXY] = "";
 
/* NOTE */
/* If you are running PHP under Apache/mod_php, also add after the above: */
apache_putenv('HTTP_PROXY', '');
 
/* rest of your php script */

保存并关闭文件。

通过编辑Go程序文件来修复您的php应用

编辑对程序的以下更改,如下所示:

import "os"
os.Unsetenv("HTTP_PROXY")

确认

要解决此问题,请在服务器上临时将以下内容作为CGI脚本安装并使其可执行(例如,在/var/www/html/cgi-bin/test.cgi中):

#!/bin/sh
echo "Content-Type:text/plain"
echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"

保存并关闭文件。
使它可执行:

chmod +x test.cgi

调用如下:

curl -H "Proxy: AFFECTED" http://your-server-ip-or-name/cgi-bin/test.cgi

如果看到以下输出,则您的服务器不受影响:

HTTP_PROXY="

相反,如果您看到以下内容或任何其他输出,则您的服务器可能会受到影响,并且您应该应用上述缓解措施之一:

HTTP_PROXY='AFFECTED'