¿Cómo se piratea un sitio web con una "imagen codificada malintencionadamente que contenía un script PHP oculto en su interior"?
openx (3)
Mi servidor de anuncios ha sido hackeado durante el fin de semana.
Parece ser un problema generalizado, según este artículo .
Hay algo ahí que me hizo pensar ...
Los atacantes utilizaron un ataque para obtener derechos de inicio de sesión en su servidor y luego cargaron una imagen codificada malintencionadamente que contenía un script PHP oculto en su interior, dijo. Al ver la imagen, los atacantes forzaron la ejecución del script en el servidor.
¿Cómo es esto posible? ¿Confía en que la imagen se abra con GD o similar? ¿Suben un guión que se presenta como una imagen y, de alguna manera, lo incluyen?
La única posibilidad que veo para un compromiso del servidor es que la imagen se include
d en lugar de leer, por ejemplo, el readfile
y otras funciones de flujo.
Puede ser tan simple como subir un archivo como
GIF89a<?php
echo ''hi'';
Si su script de carga prueba el tipo de contenido a través de fileinfo o mime_content_type()
, se reconoce como "datos de imagen GIF, versión 89a" ya que GIF89a
es el único número de patrón / magia que se requiere para identificar un archivo como gif.
Y el script de carga de OpenX aparentemente mantuvo el nombre de archivo propuesto, es decir, fue posible guardar esta "imagen" como foo.php en el servidor. Ahora, si solicitó ese archivo a través de http://hostname/uploaddir/foo.php
el script se ejecutó como un script php porque los servidores web generalmente / suelen determinar el tipo de contenido solo por la extensión del nombre de archivo, por ejemplo, a través de
<FilesMatch "/.php$">
SetHandler application/x-httpd-php
</FilesMatch>
php entonces hace eco del GIF89a
y ejecuta el bloque <?php ...code...
Poner el bloque <? Php en un comentario gif es un poco más sofisticado pero básicamente lo mismo.
Su servidor está analizando ese archivo por w / e razón. Los atacantes están poniendo el PHP en el comentario de la imagen.
¿Cómo estás validando que el archivo es una imagen? Si lo haces únicamente en tipo mime, entonces creo que pueden falsificar el encabezado de la imagen e incluir lo que quieran después de eso. VolkerK tiene un ejemplo práctico.
En el mundo perfecto, no serviría ninguna imagen pública a través de PHP por temor a un problema de este tipo.
Servir la imagen directamente usando el servidor; Una buena sugerencia es guardar esas imágenes en un directorio donde se puedan servir sin PHP.
Creo que eso es lo esencial, alguien me corrige si me equivoco.