昨晚,一个名为 httpoxy 的漏洞在安全圈内广泛传播。云盾攻防对抗团队第一时间对此漏洞进行了深入分析,发现其本质是一个 cgi 环境变量劫持漏洞,对 cgi 的环境变量 http_proxy 变量进行劫持。如果 cgi 在运行过程中依赖 http_proxy,那么攻击者将能够获取到程序敏感数据,甚至伪造返回包对 cgi 程序实现欺骗。
这个漏洞实际上 cgi 程序对变量命名不规范导致的。cgi 程序在接收到 http header 后,会把部分 header 的信息存入以 http_ 开头的变量中。header 中要是出现了 proxy 头,那么 proxy 头中的信息会存放在 http_proxy 的变量中。巧合的是,cgi 程序环境变量中本身就定义了一个 http_proxy 变量,作用是为 cgi 程序设置代理。因此,如果我们在请求中带上了 proxy 头,那么 http_proxy 变量将会被我们发送的内容覆盖,实现 http_proxy 变量劫持。需要注意的是,覆盖的变量只对当次请求有效,不会对全局的 http_proxy 变量造成影响。
我们在 x.x.27.216 上用 nc 监听 23333 端口,然后向受害网站 x.x.25.84 发送的请求中加入 proxy 头 "x.x.27.216:23333"。如下图所示,受害网站在向 restapi.amap.com 请求数据,而这个请求被我们的机器截获到了,漏洞利用成功。同时,这个请求将网站在 restapi.amap.com 使用的 key 暴露出来了,造成敏感信息泄漏。
这里分享一下我们想到的两个利用场景:
1、cgi 程序与其它网站通信时,需要 cgi 程序带上某些身份信息的,如 accesstoken、gsid、key 等,那么这些敏感信息将会被非法的代理服务器接收到,造成敏感信息泄漏。
2、对于电商类网站,若通过设置 proxy 头能截获到它向支付网关发送的请求,那么就可以篡改这个请求的返回包,如“将支付失败改为支付成功”,对原网站进行欺骗。
理论上这个漏洞影响所有以 cgi 方式运行的程序。但漏洞利用受到以下限制:
1、cgi 程序不会对外发送请求;
2、cgi 程序不依赖 http_proxy 变量;
3、cgi 程序与外部使用非 http 协议(如 https)进行通信。
如果符合上述其中一种情况,漏洞将无法利用。<b>我们认为,此漏洞的危害程度没有外界宣传的那么高。</b>
proxy 并非一个规范的 http header,因此我们没必要去处理 http 请求中 proxy 头的内容。 由于每个应用的修复方案不一样,下面以 nginx 和 apache 进行举例:
nginx:在调用 fastcgi 的地方将 http_proxy 置为空。
apache:借助 mod_headers 模块将 proxy 头置为失效。
其它应用的修复方案请参考应用官方公告或 0x04 中的参考资料。