1. 云栖社区>
  2. PHP教程>
  3. 正文

HTTPOXY漏洞说明

作者:用户 来源:互联网 时间:2017-12-01 12:59:17

漏洞说明httpoxy

HTTPOXY漏洞说明 - 摘要: 本文讲的是HTTPOXY漏洞说明, 好久没写文章了, 博客都长草了, 早上起来本来想去上班, 一看这么大雨, 这要上路了不得堵死啊. 再加上有同学对我昨天转发的微博HTTPOXY漏洞表示不理解, 问会不会影响普通应用, 于是就写篇文章介绍下, 等早高峰过了吧;)…..

好久没写文章了, 博客都长草了, 早上起来本来想去上班, 一看这么大雨, 这要上路了不得堵死啊.

再加上有同学对我昨天转发的微博HTTPOXY漏洞表示不理解, 问会不会影响普通应用, 于是就写篇文章介绍下, 等早高峰过了吧;)…..

不过要注意的是, 这里我只是介绍PHP这个角度, 关于Go和Python等其他角度的,因为我也不是”很”懂,你们还是看原文吧 HTTPOXY漏洞说明

漏洞原文在这里, https://httpoxy.org/ , 没看懂的一定都是英语没过6级的 HTTPOXY漏洞说明

这里有一个核心的背景是, 长久一来我们习惯了使用一个名为”HTTP_PROXY”的环境变量来设置我们的请求代理, 比如在命令行我们经常这么用:

http_proxy=127.0.0.1:9999 wget http://www.laruence.com/

通过设置一个http_proxy的环境变量, 让wget使用代理请求http://www.laruence.com/

时间久了, 大家就都会习惯用http_proxy来作为代理的一个命名, 于是很多PHP的类库,或者你自己写的代码都会很有可能写下如下类似的代码:

<?php$http_proxy = getenv("HTTP_PROXY");$context = array( 'http' => array( 'proxy' => $http_proxy, 'request_fulluri' => true, ),);$s_context = stream_context_create($context);$ret = file_get_contents("http://www.laruence.com/", false, $s_context);

比如很多常见的类库:

Guzzle: https://github.com/guzzle/guzzle/blob/10a49d5e1b8729c5e05cbdbf475b38b7099eb35e/src/Client.php#L167 Artax: https://github.com/amphp/artax/blob/3e3eedafcecc82c3c86c3a00ca602b5efa9c2cfa/lib/HttpSocketPool.php#L26

就有这种类似的写法.

那么问题来了, 在CGI(RFC 3875)的模式的时候, 会把请求中的Header, 加上HTTP_ 前缀, 注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx, 那么PHP就会把他注册为HTTP_PROXY环境变量, 于是getenv(“HTTP_PROXY”)就变成可被控制的了. 那么如果你的所有类似的请求, 都会被代理到攻击者想要的地址,之后攻击者就可以伪造,监听,篡改你的请求了…

比如:

curl -H "Proxy:127.0.0.1:8000" http://host.com/httpoxy.php

所以, 这个漏洞要影响你, 有几个核心前提是:

你的服务会对外请求资源 你的服务使用了HTTP_PROXY环境变量来代理你的请求(可能是你自己写,或是使用一些有缺陷的类库) 你的服务跑在PHP的CGI模式下

如果你没有满足上面的条件, 那么恭喜你,你不受此次漏洞影响 HTTPOXY漏洞说明 .

那知道了原理修复起来也很简单了, 以Nginx为例, 在配置中加入:

fastcgi_param HTTP_PROXY "";

而如果你是一个类库的作者,或者你因为什么原因没有办法修改服务配置, 那么你就需要在代码中加入对sapi的判断, 除非是cli模式, 否则永远不要相信http_proxy环境变量,

<?phpif (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) { //只有CLI模式下, HTTP_PROXY环境变量才是可控的}

就好比Guzzle的这个修复:

https://github.com/guzzle/guzzle/commit/9d521b23146cb6cedd772770a2617fd6cbdb1596#diff-ff73e042e738204c6da009e2ed19f783L166

thanks

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索漏洞 , 说明 httpoxy ,以便于您获取更多的相关知识。