IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    昨晚深夜爆出的: httpoxy 远程代理感染漏洞

    李鹏发表于 2016-07-19 02:50:52
    love 0

    漏洞原文在这里, https://httpoxy.org

    背景:我们习惯使用一个名为”HTTP_PROXY”的环境变量来设置我们的请求代理, 例如:

    http_proxy=127.0.0.1:9999 wget https://www.itlipeng.cn/

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

    时间久了, 大家就都会习惯用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.itlipeng.cn/", false, $s_context);
    
    

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

     

    注意了,漏洞影响的前提有以下几点:

    1. 你的服务会对外请求资源
    2. 你的服务使用了HTTP_PROXY环境变量来代理你的请求
    3. 你的服务跑在PHP的CGI模式下

    没有满足上面几个前提,你的代码是不会受到这个漏洞的影响的~

     

    修复的方法有:

    Nginx:

      fastcgi_param  HTTP_PROXY  “”;

    PHP :

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


沪ICP备19023445号-2号
友情链接