天天看点

HTTPOXY漏洞下的思考

晚晚刷微博看到最新爆出的httpoxy远程代理感染漏洞的介绍

今天中午看到鸟哥(风雪之隅)博客更新了:http://www.laruence.com/2016/07/19/3101.html

摘录重点:

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

以前并没有关注Web容器的变量实现,正好借这个洞补了一下知识点:

1、所有HTTP_开头的环境变量在CGI下都是可以由客户端发起和创建的。攻击者可以通过这个漏洞伪造环境变量,监听篡改你的请求

我们用火狐Httprequeter插件构造一个请求,添加一个命字叫“twm”的头,值是“No.1”

在接收页面中放入以下代码:

$tmp_server=$_SERVER["HTTP_TWM"];
$tmp_env=getenv("HTTP_TWM");
echo $tmp_server,"||",$tmp_env;
           

可以看到输出 No.1||No.1。

如果我们添加的是命字叫“Proxy”的头,值“No.2”2

在接收页面中放入以下代码:

$tmp_server=$_SERVER["HTTP_PROXY"];
$tmp_env=getenv("HTTP_PROXY");
echo $tmp_server,"||",$tmp_env;
           

可以看到输出 No.2||No.2

2、getenv()可以获取系统环境变量值,也就是$_SERVER变量中的值,不存在返回FALSE。

在IIS下以ISAPI运行PHP时,getenv()无法获取到相应的值,而只能使用$_SERVER。

getenv()的优点应该就是在获取时,如果值不存在会返回FALSE,而如果直接使用$_SERVER变量获取不存在的值时会报错

3、英语很重要。