Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Bugs y Exploits => Hacking => Nivel Web => Mensaje iniciado por: RicRed en 13 Mayo 2012, 22:13 PM

Título: Upload de imagenes seguro PHP
Publicado por: RicRed en 13 Mayo 2012, 22:13 PM
Hola a la gente del foro, estoy tratando de hacer un upload de imagenes seguro en PHP, en la cual los usuarios puedan subir imagenes en una carpeta y publicarlas en el foro.

Tengo el siguiente codigo:

Código (php) [Seleccionar]
       <form action="" method="post" enctype="multipart/form-data">
          <p>
          <input type="file" name="imagen">
          <input type="submit" name="submit" value="Subir" /></p>
       </form>
       <?php
        
if(isset($_FILES['imagen'])){
        
//configuracion
           
$permitidas = array('jpg','jpeg','png','gif'); //extensiones permitidas
           
$size=2097152//tamano maximo en bytes
           
$url="http://localhost/otros/upload/"//con / al final
           
$carpeta="images/"//carpeta de las imagenes
          
           
$errores = array();
           
$nombre trim($_FILES['imagen']['name']);
           
$ext strtolower(end(explode('.',$nombre)));
           
$tamano $_FILES['imagen']['size'];
           
$tmp $_FILES['imagen']['tmp_name'];
           
$urlimagen=$carpeta.rand().$nombre;
         
           if(
in_array($ext,$permitidas) === false){
              
$errores[] = 'Extension no permitida';
           }
           if(
$tamano>$size){
              
$errores[] = 'El tamaño del archivo debe ser menor a 2mb';
           }
           if(empty(
$errores)){
              if(
move_uploaded_file($tmp,$urlimagen)){
                 
?>

                <h3>html</h3>
                <input type="text" value="<img src='<?php echo $url.$urlimagen ?>'>" /><br />
                <h3>BBcode</h3>
                <input type="text" value="[img]<?php echo $url.$urlimagen ?>[/img]" /><br />
                <h3>Enlace directo</h3>
                <input type="text" value="<?php echo $url.$urlimagen ?>" /><br />
                <?php
              
}
           }else{
              foreach(
$errores as $error){
                 echo 
$error."<br />";
              }
           }
        }
        
?>


Sube archivos con extensiones de imagenes, al subir un php da un error

Extension no permitida

Hay bien, pero pueden burlar el sistema y subir una imagen con codigo php ejemplo, subo una imagen con codigo php y luego edito por post jpg por php y subiria un archivo php?

Espero me ayuden.

Saludos! y disculpen la pregunta.
Título: Re: Upload de imagenes seguro PHP
Publicado por: Shout en 14 Mayo 2012, 01:48 AM
Hombre, pueden subir una imágen (válida) con código PHP en los comentarios, aunque si has verificado que en tu web no hay LFI, no hay problema ;)

Igual pasala por GD, así se eliminan los comentarios y, también aplicale algo como getimagesize() o similares, si tiran error es que no es una imágen válida, así cancelas el upload y listo.

PD: Filtra también que el nombre no contenga el byte nulo porque, si lo contiene, no estoy seguro pero puede que logren bypassear tu filtro.




Explicación sobre el byte nulo:
Imaginate que tienes esto en PHP:
Código (php) [Seleccionar]
<? if(file_exists('include/'.$_GET['include'].'.php')) include('include/'.$_GET['include'].'.php'); ?>

Y yo voy a:
file.php?include=../files/avatares/mi_avatar_con_comentario_malicioso.jpg%00

Se incluiría perfectamente el archivo, pues el %00 es el byte nulo, que indica el final del string, por lo que el resto es ignorado y el include queda como include/../files/avatares/mi_avatar_con_comentario_malicioso.jpg, y, al tener los tags PHP <? ?> (la imagen en los comentarios), la función include los evalúa y ejecúta el código, por lo que el atacante tendría el poder de ejecutar código PHP en tu servidor (más que suficiente para hackearte por completo).

Nota: no es necesario que el archivo sea .php para que include() ejecute el código que hay en él (entre los tags <? ?>).

Espero que me hayas entendido.

Saludos.
Título: Re: Upload de imagenes seguro PHP
Publicado por: WarGhost en 19 Mayo 2012, 23:33 PM
Lo mejor que puedes hacer es pasarla por GD (http://php.net/manual/es/book.image.php), así evitar la inyección de código .

También puedes ver esto:
http://es.php.net/manual/es/security.hiding.php

Lo mejor es tener un código libre de errores, pero cada eslabón de seguridad adicional ayudan.


Un saludo!