[Pregunta]: ¿Opiniones sobre la seguridad de esta función?

Iniciado por Leguim, 28 Agosto 2019, 20:30 PM

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

Leguim

Buenos días tengo esta función que sirve para validar un archivo (se espera que sean imagenes)
de momento esto es lo que tengo.

Código (php) [Seleccionar]

function Validate_Photo($photo)
{
$result = false;

if($photo['type'] == 'image/gif' || $photo['type'] == 'image/jpg' || $photo['type'] == 'image/jpeg')
{
$verify_img = getimagesize($photo['tmp_name']);

if($verify_img['mime'] == 'image/gif' || $verify_img['mime'] == 'image/jpg' || $verify_img['mime'] == 'image/jpeg')
{
$result = true;
}
}

return $result;
}


Me interesa saber sus opiniones y críticas sobre el nivel de seguridad que tiene esta función.

Gracias!



Mod: Temas sobre PHP van al subforo de PHP.

Siler

Getimagesize, Mime y Fileinfo son inseguras. Todas se pueden bypassear, engañar o utilizar en inyección de código de alguna manera. Por eso se deben complementar con múltiples configuraciones orientadas a la seguridad.

  • Utiliza un servidor privado únicamente para la subida de imágenes y las posteas en un link privado. Publica el link a una captura y obtenla con OCR o una screenshoot de la imagen desde tu servidor. Evitas DoS, explotaciones de vulnerabilidades en el visualizador de imágenes de tu server y ejecución arbitraria de código.

  • Limita el tamaño al mínimo y máximo posible del archivo.

  • Limita el número máximo de archivos subidos. Imagenes totales. Máximo tamaño en el servidor reservado a imágenes. Por usuario. Por minuto... Y número máximo de subidas simultaneas...
    Con el objetivo de que no gasten todo el bandwidth contratado, saturen la RAM o llenen el espacio de disco. Si solo limitas por usuario, podrían ir creando cuentas durante días para hacer un ataque simultaneo.

  • Cámbiale el nombre al archivo para que no te inyecten nada en el nombre de archivo, hagan path transversal o problemas de enconding. Obten y pon la extensión en el nombre. En el caso de que suban un malware.png.php al renombrarlo a imagen4.png no se ejecuta el PHP. Esto se aplica a muchas extensiones.

  • Guarda la imagen en un directorio sin permisos (chmod) con move_uploaded_file. Ten cuidado con no mover el archivo a un lugar donde se haga público y el atacante pueda acceder o mandar el link a otro usuario. Inhabilita la ejecución de PHP, HTML, executables... creando un archivo .httaccess. Haz una white list y ubica el httaccess en el directorio padre. Nunca en el mismo directorio que alojas las imágenes. Deshabilita sobrescritura.

  • Utiliza readfile() para acceder a las imágenes en un directorio externo.


  • Pon el contenido en un subdominio y hazlo accesible solo desde ahí.

  • Utiliza is_uploaded_file($imagen) para no hacer comprobaciones inecesarias y asegurarte que la subida se hace por POST y que no es una imagen local. Podrían subir una imagen privada de tu servidor u otros clientes para hacerla pública y así tener acceso a ella. Ojo, que se puede mandar peticiones crafteadas para que el servidor interprete las extensiones de imágenes como si fuesen scripts en PHP.
Diseño de malware, information gathering y engagement.

Leguim

Hola, gracias por responder ya puse en practica algunas cosas de las cuales comentaste!

¿Qué quiere decir un servidor privado?
El link de la capturas, ocr, etc

WHK

Primero que nada habría que ver de que manera estás obteniendo esa información para ser procesada, la mayoría de las vulnerabilidades no están en la comparación de tipos sino en como se establece el valor del tipo.

Saludos.