Sobre seguridad al subir imagenes

Iniciado por Alex_bro, 3 Agosto 2009, 04:39 AM

0 Miembros y 1 Visitante están viendo este tema.

Alex_bro

Buenas,
Mi actual proyecto exige que se puedan subir unas pequenias imagenes a modo de foto de cada usuario.
La verdad es que soy completamente novato en esto de subir archivos.
La forma de subirlo y demas, ya la busco yo. Lo que necesito es que me den consejos de seguridad.
Siempre me ha dado mal royo esto de permitir subir archivos, y ahora mas, cuando leo en un articulo que segun la configuracion de apache de mi hosting, podria ejecutarse php con una imagen llamada lokesea.php.gif y puf...
Tambien quisiera saber si aumenta el riesgo al usar la siguiente tecnica para ocultar la direccion, al usar readfile para cargar la imagen en el buffer:
Ocultar la direccion de una imagen con php

Gracias!!!

:ohk<any>

No tengo mucha experiencia en este campo francamente no permito que se suba cosas al servidor y la ves que lo hice use un script avalado por muchas personas.
Creo que lo mejor es que ocultes la direccion del archivo que se subio, aunque francamente al final se llega a saber donde esta la imagen, aunque creo que el que desarrollo esta pagina http://i.elhacker.net/ que creo que fue sdc es el mas indicado para darte una mano, mejor si le mandas un MP quiza te ayude.
Y es que a veces pienso que si no estuviera loco no podría salir adelante.
Lo que no se es capaz de dar, en realidad no se posee, uno es poseído por ello.

Alex_bro

Gracias.
La verdad, hasta ahora yo tampoco habia permitido nunca que se subieran cosas al server. Soy demasiado paranoico jaja. Pero mi actual proyecto lo exige.

Le mandare un mensaje a sirdarckcat a ver si me puede guiar un poco.

Un saludo.

[u]nsigned

Bueno, la verdad que es un tanto paranoico lo tuyo  :). Porque en ambos atículos, ademas de exponer el 'xploit', se describe el 'parche'.

Primero lo segundo: que caso tiene olcultar la url de una imagen?..es decir..si sé de la existencia de dicha imagen es por que la he visto en mi navegador: un pantallaso y al diablo el sistema de ofuscación de url  :xD  :)..y si lo que querés es evitar es el uso externo de tus img podes sacarlas mediante php solo si se llaman 'en local'.

Y en cuanto a los primero se soluciona:
* No permitiendo dobles extensiones ni archivos llamado '.htaccess',
* Usar getimagesize para validar el header de dicha imagen,
* Usar un .htaccess en el directorio padre al que se suben las imagenes, para indicar los tipos soportados y evitar que se ejecuten scripts en dicho directorio hijo.
* Generar el nombre de la imagen guardada en el server aleatoriamente y luego agregarle la exención. Y tambien evitar cualquier sobre escritura dentro de dicho directorio.
* Como ultima medida (aunque poco segura) validar que el cliente proviene del formulario propio y no uno externo.

Todo esto lo extraje de dicho artículo. Mi ingles no es muy bueno, pero mas o menos dice eso.. ;)

Saludos

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

sirdarckcat

convierte todos los archivos de formato y modifica la imagen un poco.. (por ejemplo, creando una nueva imagen y anexando la imagen del usuario como extra).

Aunque eso podria tener problemas de seguridad si la libreria que parsea las imagenes tiene algun BoF o algo, tambien deberias de poner todas las imagenes con Content-Disposition: attachment;filename=nombrerandom.extension

Guarda las imagenes en un directorio no accesible via web o en una base de datos.. limita el tam;o de las imagenes, no des acceso a ellas directamente (haz algo como.... verimagen?imagen=191919 o algo similar rescrito con modrewrite o algo asi..) debes cuidarte de bugs de SQLinjection, RFI, LFI, etc..

Asegurate de que si usas una base de datos guardes la informacion en campos binarios (no uses char y demas), valida el referrer que solo sea de fuentes confiables, y si no hay referrer (ya sea porque se esta incluyendo de un sitio con SSL o de un data URI o similar) requiere una cookie generada aleatoriamente del explorador, y haz Location a ti mismo (sin cargar la imagen) para protegerte de ataques basicos de ddos..

La mayoria de estas protecciones son medio extremas, pero pues... asi pasa cuando sucede jaja..

Saludos!!

Alex_bro

Perdonen mi tardanza en responder, estuve ausente unos dias.
He seguido sus consejos y al final voy a comparar el mime con la informacion que da $_FILE, con la funcion getimagesize() y voy a comprobar la extension. Despues un numbre aleatorio, sin dejar rastro del antiguo, y finalmente un .htaccess con un Deny From All para mayor seguridad. Las imagenes ya las leo con readfile, y listo!

Con esto ya creo que estaria bien... no se me ha olvidado nada no? Bueno tambien voy a reconstruir la imagen con GD como bien dice SDC para eliminar cualquier cabecera.

Por ahora estoy probando el codigo final, e intentando convertitlo en una class para dejarlo aqui publicado que seguro sera util, pero estoy teniendo problemas con GD, que funciona bien mientras no esta metido todo en funciones ni clases. Espero conseguirlo.

Gracias por todo. :D