写点什么

关于 HTTPOXY 漏洞的分析说明

2016 年 7 月 19 日

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

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

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

漏洞原文在这里,没看懂的一定都是英语没过6 级的 :)

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

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

有据可考的是,这样的设定最初来自 1994 年的 CERN libwww 2.15 ,我猜测大概是当时很多工具是基于这个类库做的,于是就慢慢成了一个既定标准吧. 只不过这些应用都要求http_proxy是全部小写的,还不足以造成今天这个漏洞。

但估计是因为环境变量习惯都是大写的原因吧,后来有的类库开始支持大写的http_proxy,比如 yum

再后来很多的类库,各种语言的,都开始支持这种配置,有的支持大写的,有的支持小写的,还有的都支持。

包括我们自己,也很有可能在日常的工作中写出如下的代码 (我就曾经在写爬虫的时候写过):

复制代码
1. <?php
2. $http_proxy = getenv("HTTP_PROXY");
3. if ($http_proxy) {
4. $context = array(
5. 'http' => array(
6. 'proxy' => $http_proxy,
7. 'request_fulluri' => true
8. ),
9.
10. );
11. $s_context = stream_context_create($context);
12. } else {
13. $s_context = NULL;
14. }
15. $ret = file_get_contents("http://www.laruence.com/"false, $s_context);

那么问题来了,在 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 模式下 (cgi,php-fpm)

如果你没有满足上面的条件,那么恭喜你,你不受此次漏洞影响 :)。

后记:经过微博同学的提醒,我可能把这个问题的影响潜意识的让大家觉得危害不大,但实际上,延伸一下——所有 HTTP_ 开头的环境变量在 CGI 下都是不可信的,千万不要用于敏感操作,另外一点就是,我深刻的体会过,做安全的同学想象力非常丰富,虽然看似很小的一个点,但到了安全的同学手里,配合他们丰富的想象力,强大的社工能力,也是能做出巨大攻击效果的….

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

fastcgi_param HTTP_PROXY <span>""</span>;所以建议,即使你不受此次漏洞影响,也应该加入这个配置。

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

复制代码
1. <?php
2. if(php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {
3. // 只有 CLI 模式下, HTTP_PROXY 环境变量才是可控的
4. }

就好比 Guzzle 的这个修复: Addressing HTTP_PROXY security vulnerability

本文转载自鸟哥的博客,原文地址为: http://www.laruence.com/2016/07/19/3101.html

2016 年 7 月 19 日 03:481653

评论

发布
暂无评论
发现更多内容

云计算简史(上)- 15分钟读完15年

明道云

反杀套路!阿里独家的MySQL优化王者晋级之路,跟弯路说再见

Java成神之路

Java 程序员 架构 面试 编程语言

帆软授权失效处理

Flychen

甲方日常 33

句子

工作 随笔杂谈 日常

架构师的成长之路

华章IT

CTO 架构师 架构师之道

据说99.99%的人都会答错的类加载的问题

AI乔治

Java 架构 JVM 类加载 性能调优

计算机网络基础知识总结

cxuan

计算机网络 计算机

LAXCUS大数据集群操作系统:一个分布式分时共享E级系统软件(四)

陈泽云

人工智能 大数据 数据结构 操作系统 数据存储

来自阿里面试官的Java面试连珠炮,让你自由发挥你能撑到哪一步?

Java成神之路

Java 程序员 架构 面试 编程语言

5G时代音视频开发王器:WebRTC

华章IT

flutter WebRTC 音视频会议 React Native

微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

AI乔治

Java 架构 微服务 ,docker

关注你自己,如同篮球巨星一样,让身体最佳化,持续投入最爱的事情。

叶小鍵

健康 科普 王立铭 肥胖

黄金圈法则:成功者必备的深度思考方法

陆陆通通

黄金圈法则 厉害 牛逼

第12周学习总结

Vincent

极客时间 极客大学

Servlet-技术专题-Servlet3异步原理与实践

李浩宇/Alex

架构训练营 - 第4周课后作业 - 学习总结

Pudding

完美,阿里DBA骨干团队编写的792页MySQL调优笔记真香

周老师

Java 编程 程序员 架构 面试

“区块链×多方计算”解决众多难题 将成区块链应用新场景

CECBC区块链专委会

区块链 数据融合

“区块链技术创新要植根市场”

CECBC区块链专委会

金融科技 信息安全

第19届亚运会门票采用区块链技术防伪

CECBC区块链专委会

区块链技术 防伪 溯源

手把手带你玩转 openEuler | openEuler 的使用

openEuler

操作系统 openEuler

京东智联云MySQL数据库如何保障数据的可靠性?

京东智联云开发者

MySQL 数据库

最新版MySQL在MacOS上的安装与使用

王磊

MySQL

架构师训练营 - 第 4周课后作业(1 期)

Pudding

考研须知

时间是一个人最好的证明

考研

有了容器为什么kubernetes还需要Pod?

架构师修行之路

分布式 微服务 pod kubernete

第12周作业

Vincent

极客时间 极客大学

十七、深入Python异常处理

刘润森

Python

让AI人才在产业界闪闪发光:百度之星的“神奇滤镜”是怎样炼成的?

脑极体

分布式系统设计理念这么难学?

架构师修行之路

分布式 微服务

Java Reference核心原理分析

AI乔治

Java 架构 JVM 性能调优

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

关于HTTPOXY漏洞的分析说明-InfoQ