User Tools

Site Tools


dos_en_servidores_php_con_phpstress

Denegación de servicio a servidores web con PHP-CGI o PHP-FPM con PHPstress

La utilidad PHPstress realiza multitud de llamadas PHP simples de forma constante para intentar llenar el servidor de procesos php abiertos. Dependiendo de la configuración del servidor web no sería difícil sobrecargar el servidor y causar una denegación del mismo, las solicitudes realizadas por el ataque continuarán manteniendo los recursos del servidor en uso tiempo después del final del ataque. Una utilidad muy buena para realizar pruebas de stress y probar configuraciones.

La principal diferencia de PHPstress con respecto a Slowloris, es que la segunda se centra en establecer conexiones HTTP a servidores Apache y PHPstress se centra en realizar muchas conexiones PHP-CGI o PHP-FPM (ya sea dentro de Apache, Nginx u otro servidor web).

Web PHPstress: https://github.com/nightlionsecurity/phpstress

Sintaxis de PHPstress.

php phpstress.php www.targeturl.com -d 0 -r 0

Impacto en PHP-FPM

En los servidores que utilizan PHP-FPM, el número máximo de procesos se mantiene sobre la base configurada en el archivo de configuración mediante “pm.max_children”, si esta es de 25, el número máximo de procesos generados se quedará en el 25. Dependiendo de cómo se establecen los ajustes de tiempo de espera, los procesos permanecerán abiertos durante al menos esa cantidad de tiempo tras el ataque (generalmente dos minutos).

Impacto en PHP-FCGI

Los resultados con FastCGI bajo Apache son mucho más interesantes. En lugar de seguir a generar más procesos FastCGI, Apache utiliza su directiva “MaxClients” y lanza todos los procesos que necesita para hacer frente al número de solicitudes quedando el servidor totalmente saturado de cientos de procesos Apache.

Opciones a modificar para mitigar este tipo de ataques DOS en Apache y Nginx

Lo mostrado a continuación son los valores predeterminados (NO los recomendables), los cuales se deben modificar / adaptar para mitigar denegaciones de servicio mediante solicitudes PHP. Los valores pueden ser otros dependiendo de la distribución utilizada. Algunas versiones de GNU/Linux como Debian ofrecen configuraciones más concienciadas con la seguridad de forma predeterminada y puede que requiera de poca o ninguna modificación por nuestra parte para tenerlo a salvo de este tipo de denegaciones de servicio.

FCGID (/etc/httpd/conf.d/fcgid.conf)

# Number of seconds of idle time before a process is terminated
FcgidIOTimeout 1000 # maximum period of time the module will wait while trying to read from or write to a FastCGI application
FcgidMaxProcessesPerClass 100 #maximum number of processes per class (user)
FcgidIdleTimeout 240 # application processes which have not handled a request for this period of time will be terminated
FcgidProcessLifeTime 3600 # maximum lifetime of a single process (seconds)
FcgidMaxProcesses 1000 #maximum number of FastCGI application processes which can be active at one time.

Apache – httpd.conf (/etc/httpd/conf/httpd.conf)

Timeout 60
KeepAliveTimeout 15
KeepAlive Off
MaxKeepAliveRequests 100
 
<IfModule mpm_worker_module>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit     256
    MaxClients     256
</IfModule>

PHP-FPM (/etc/php-fpm.conf)

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 10s

Para cada dominio: /etc/php-fpm.d/domain.conf (Puede configurarse de forma global en php-fpm.conf)

; By default use ondemand spawning (this requires php-fpm >= 5.3.9)
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 60s
dos_en_servidores_php_con_phpstress.txt · Last modified: 2020/12/25 22:57 by 127.0.0.1