¿Es posible que un hacker omita subir un archivo php?

4

Quiero incluir un sistema de filtrado en mi script. Aquí está:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png","bmp");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (in_array($extension, $allowedExts)){
//here is rst of codes
?>

Significa que mi script verificará la extensión para cargar el archivo con explode . Entonces, ¿es posible que un hacker omita este sistema? ¿Y subir script de código malicioso?

    
pregunta Imran Abdur Rahim 01.10.2013 - 18:56
fuente

3 respuestas

9

Muchas cosas todavía pueden salir mal, dada una aplicación que contiene este pequeño fragmento de código.

  1. Un atacante podría usar un archivo local que incluye una vulnerabilidad para obtener ejecución remota de código al colocar el código PHP dentro de los metadatos de una imagen cargada.
  2. Un atacante podría escribir una imagen con un archivo válido
    extensión en cualquier directorio utilizando recorrido de directorio .
  3. En versiones anteriores de PHP, un atacante podría usar un byte nulo para controle la extensión truncando el nombre del archivo, pero FILE las funciones escaparán de bytes nulos a partir de PHP 5.3.4.
respondido por el rook 01.10.2013 - 19:45
fuente
0

Aunque por sí solo no es 100% seguro, sugeriría que verifique el tipo MIME del archivo en lugar de una extensión que use exif_imagetype . Es un buen paso para ayudar a validar la imagen.

Cualquier persona puede pegar código PHP malicioso en un archivo .gif, y con muchos fcgi / fpm's y enrutamiento, PHP lo analizará si se carga en un directorio web y el atacante busca esta página.

Para evitar esto, desea asegurarse de que sus archivos no estén en su raíz web, y si está utilizando algún tipo de enrutamiento o reescritura de URL, desactive PHP-FPM / mod_php para .gif|.jpg|.jpeg etc. Esto le ayudará a la larga también. A menos que haya un día fuera en algún lugar, la carga de un archivo no ejecuta un eval() en él, por lo que se debe acceder al archivo directamente para que sea malicioso.

Además de esto, sugeriría que ejecutes array getimagesize ( string $filename [, array &$imageinfo ] ) en tu imagen. Si devuelve 0 , no es una imagen válida. Tampoco necesita GD para que esto funcione.

    
respondido por el Mike Mackintosh 01.10.2013 - 21:15
fuente
0

Sí.

Una forma común de omitir la comprobación simple como la que está utilizando es usar un archivo de imagen real (por ejemplo, un JPEG) y agregar una cáscara remota dentro del comentario de la imagen.

Para comprobar si su implementación es vulnerable o no, simplemente tome una imagen válida y agregue el siguiente shell básico como un comentario con el editor de su elección (por ejemplo, Photoshop, GIMP):

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

Cuando la imagen se cargue correctamente, intente llamarla con el parámetro cmd configurado a un comando simple (por ejemplo, /upload/shell.jpg?cmd=ls ). Si la carpeta donde se carga se ejecuta cualquier tipo de archivo, entonces el shell debería estar activo.

Nota: algunas funciones de PHP, como el sistema que se usa aquí, podrían estar deshabilitadas. En este caso, hay un número o diferentes funciones que pueden intentarse para ejecutar comandos.

    
respondido por el Gurzo 01.10.2013 - 19:45
fuente

Lea otras preguntas en las etiquetas