如何修复Httpoxy在Linux或Unix上的CGI PHP/Nginx/Apache/Go应用程序漏洞
在使用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'