前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何保护您的服务器免受HTTPoxy漏洞的影响

如何保护您的服务器免受HTTPoxy漏洞的影响

原创
作者头像
黑色技术
修改2018-10-23 17:22:16
1.7K0
修改2018-10-23 17:22:16
举报
文章被收录于专栏:云计算教程系列

什么是HTTPoxy?

2016年7月18日,披露了一个名为HTTPoxy的CGI应用程序漏洞。攻击者可以通过传递带有请求的HTTPProxy 标头来利用易受攻击的部署,这会在联系支持服务时更改应用程序使用的URL。这可用于泄漏凭据,修改对应用程序的响应等。

该漏洞是由HTTP_PROXY环境变量(通常用于指定后端代理服务的位置)与ProxyHTTP客户端标头之间的名称冲突引起的。该CGI规范要求的客户提供的头被传递到环境与HTTP_用于命名空间的前缀。这种破坏与配置变量冲突,如同以HTTP_开头的HTTP_PROXY。如果CGI应用程序或库使用此变量而不进行其他处理,则在尝试连接到代理服务时,最终可能会使用客户端提供的值。

由于此漏洞会影响各种类似CGI的实施,因此创建了许多安全漏洞标识符:CVE-2016-5386CVE-2016-5386CVE-2016-5387CVE-2016-5388CVE-2016- 1000109CVE-2016-1000110(在撰写本文时,这些是保留的,但未填写)。

自2001年以来,HTTPoxy漏洞以某些形式出现,但直到最近才被认为是一个普遍存在的问题。虽然它可能影响许多部署,但缓解非常简单直接。

易受攻击的服务器和应用程序

HTTPoxy是许多CGI实现发现的一般漏洞。应用程序或服务器可以正确实现CGI规范,但仍然容易受到攻击。

要使部署易受攻击,必须:

  • 使用HTTP_PROXY环境变量来配置代理连接:在应用程序代码本身或任何使用的库中使用。这是使用环境配置代理服务器的一种相当标准的方法。
  • 使用HTTP向后端服务发出请求:由于名称冲突是特定于HTTP_前缀的,因此只有应用程序使用HTTP发出的请求才会受到影响。使用HTTPS或任何其他协议的请求不容易受到攻击。
  • 在类似CGI或CGI的环境中运行:将客户端标头转换为带HTTP_前缀的环境变量的部署很容易受到攻击。任何兼容的CGI或FastCGI等相关协议的实现都可以做到这一点。

如您所见,部署和特定于应用程序的因素的组合对于易受攻击的部署是必要的。为了测试您的部署是否受到影响,Luke Rehmann创建了一个简单的站点来检查可公开访问的站点是否存在漏洞

语言特定信息

特别是PHP应用程序应该被审计,因为类似CGI的部署在PHP生态系统中比在其他语言中更常见。此外,该getenv方法在流行的库中的广泛使用放大了这个问题,因为不能立即清楚这将返回未经过处理的用户输入,而不仅仅是配置变量。当前受影响的特定库是Guzzle(版本4.0.0rc2及更高版本),Artax和Composer的StreamContextBuilder类。

使用CGI部署时发现易受攻击的其他语言是Python和Go。这些语言通常使用其他非易受攻击的方法进行部署。但是,如果使用CGI,那些天真地读取HTTP_PROXY变量而不修改其行为的库很容易受到攻击。

如何打败漏洞

幸运的是,HTTPoxy修复起来相对简单。可以从Web服务器层或应用程序或库中解决该漏洞:

  • 当应用程序或库HTTP_PROXY处于CGI环境中时,它们可以忽略该变量。
  • 应用程序或库可以使用不同的环境变量来配置代理连接
  • Web服务器或代理可以取消设置Proxy客户端请求中收到的标头

如果您使用的是易受攻击的库,则应该缓解服务器端的威胁,直到有可用的补丁来解决问题。如果您是库或应用程序作者,并且您的项目依赖于HTTP_PROXY变量来配置代理后端,请考虑使用在类似CGI的环境中运行时不会发生冲突的备用变量。Ruby和其他一些项目把CGI_HTTP_PROXY用于此目的。

由于Proxy标头不是标准HTTP标头,因此几乎在所有情况下都可以安全地忽略它。这可以在用于将请求定向到应用程序本身的Web服务器或负载平衡器中完成。由于ProxyHTTP标头没有任何标准的合法用途,因此几乎总是可以删除它。

任何常见的Web服务器,负载平衡器或代理都可以取消设置相应的标头。

使用Apache删除HTTP代理标头

如果您正在运行Apache HTTP Web服务器,则mod_headers可以使用该模块取消设置所有请求的标头。

Ubuntu和Debian服务器

要在Ubuntu或Debian服务器中启用mod_headers,请键入:

代码语言:javascript
复制
sudo a2enmod headers

然后,打开全局配置文件:

代码语言:javascript
复制
sudo nano /etc/apache2/apache2.conf

接近底部,添加:

代码语言:javascript
复制
. . .
RequestHeader unset Proxy early

保存并关闭文件。

检查配置是否存在语法错误:

代码语言:javascript
复制
sudo apache2ctl configtest

如果未报告语法错误,请重新启动服务:

代码语言:javascript
复制
sudo service apache2 restart

CentOS和Fedora服务器

对于传统安装,默认情况下应启用该mod_headers模块。要取消设置Proxy标头,请打开全局配置文件:

代码语言:javascript
复制
sudo nano /etc/httpd/conf/httpd.conf

接近底部,添加:

代码语言:javascript
复制
. . .
RequestHeader unset Proxy early

完成后保存并关闭文件。

键入以下命令检查语法错误:

代码语言:javascript
复制
sudo apachectl configtest

如果未报告语法错误,请键入以下命令重新启动服务:

代码语言:javascript
复制
sudo service httpd restart

使用Nginx删除HTTP代理标头

在Nginx中,缓解同样微不足道。您可以轻松清理服务器或上游运行的任何类似CGI的环境。

Ubuntu和Debian服务器

在Ubuntu和Debian服务器上,FastCGI参数通常包含在设置FastCGI代理时的文件fastcgi_paramsfastcgi.conf文件中。您可以在这两个文件中取消设置HTTP_PROXY标题:

代码语言:javascript
复制
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a  /etc/nginx/fastcgi_params

如果在配置FastCGI代理时未获取其中一个文件,请确保在代理位置本身中包含相同的行:

代码语言:javascript
复制
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

如果您使用Nginx进行常规HTTP代理,则还应清除HTTP Proxy标头。HTTP代理头在/etc/nginx/proxy_params文件中设置。您可以通过键入以下内容来添加规则以将Proxy标头取消设置为该文件:

代码语言:javascript
复制
echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params

同样,如果您不是从服务器块配置中获取此文件,则必须将其添加到代理位置本身:

代码语言:javascript
复制
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

键入以下命令检查语法错误:

代码语言:javascript
复制
sudo nginx -t

如果未报告任何错误,请重新启动该服务:

代码语言:javascript
复制
sudo service nginx restart

CentOS和Fedora服务器

Nginx的在CentOS和Fedora也使用相同fastcgi_paramsfastcgi.conf文件来配置FastCGI的代理。键入以下内容,取消设置这两个文件中的HTTP_PROXY标题:

代码语言:javascript
复制
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a  /etc/nginx/fastcgi_params

如果在配置FastCGI代理时未获取其中一个文件,请确保在代理位置本身中包含相同的行:

代码语言:javascript
复制
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

如果您使用Nginx进行常规HTTP代理,则还应清除HTTP Proxy标头。您只需添加规则即可在执行proxy_pass的任何位置的地方取消设置Proxy标头。如果您不确定使用proxy_pass的位置,可以轻松搜索配置目录:

代码语言:javascript
复制
grep -r "proxy_pass" /etc/nginx
/etc/nginx/nginx.conf.default:        #    proxy_pass   http://127.0.0.1;

任何未注释掉的结果(如上例所示)都应编辑为包括proxy_set_header Proxy "";

代码语言:javascript
复制
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

键入以下命令检查语法错误:

代码语言:javascript
复制
sudo nginx -t

如果未报告任何错误,请重新启动该服务:

代码语言:javascript
复制
sudo service nginx restart

使用HAProxy删除HTTP代理标头

如果您使用HAProxy将流量定向到应用程序服务器,则可以Proxy在转发流量之前删除标头。

打开/etc/haproxy/haproxy.cfg文件进行编辑:

代码语言:javascript
复制
sudo nano /etc/haproxy/haproxy.cfg

您可以在frontendbackendlisten配置的部分设置http-request的指令。

代码语言:javascript
复制
frontend www
    http-request del-header Proxy
    . . .
​
backend web-backend
    http-request del-header Proxy
    . . .
​
listen appname 0.0.0.0:80
    http-request del-header Proxy
    . . .

这些不需要在每个部分中设置,但包含它们不会有害。完成后保存并关闭文件。

键入以下命令检查语法:

代码语言:javascript
复制
sudo haproxy -c -f /etc/haproxy/haproxy.cfg

如果未发现任何问题,请键入以下命令重新启动服务:

代码语言:javascript
复制
sudo service haproxy restart

结论

HTTPoxy漏洞已经公开了很长时间,可能会影响Web上部署的大量应用程序。幸运的是,使用任何Web服务器本机的标头更改功能很容易修复。

更多教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Protect Your Server Against the HTTPoxy Vulnerability》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是HTTPoxy?
    • 易受攻击的服务器和应用程序
      • 语言特定信息
    • 如何打败漏洞
      • 使用Apache删除HTTP代理标头
        • Ubuntu和Debian服务器
        • CentOS和Fedora服务器
      • 使用Nginx删除HTTP代理标头
        • Ubuntu和Debian服务器
        • CentOS和Fedora服务器
      • 使用HAProxy删除HTTP代理标头
        • 结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档