domingo, 3 de abril de 2011

Bypass Uploader

Un Upload no es una vulnerabilidad, pero lo considero un gran error del Administrador.

Porque?
un usuario con acceso a un upload mal filtrado puede
fácilmente subir un archivo malicioso al servidor perjudicando ala web,
o en casos graves a todo el Servidor.

Empezamos codeando nuestro Uploader


upload.php


@form action="subearchivo.php" method="post" enctype="multipart/form-data"@

Campo de tipo texto:@br@

@input@@ type="text" name="cadenatexto" size="20" maxlength="100"@@br@
@input@@ type="hidden" name="MAX_FILE_SIZE" value="100000"@@br@

Subir Archivo:@br@

@input@> name="userfile" type="file"@@br@
@input@>type="submit" value="Enviar"@@br@
<@/form@>

----------------------------------------------------------
subearchivo.php

@? //tomo el valor de un elemento de tipo texto del formulario
$cadenatexto = $_POST["cadenatexto"];
echo "Escribió en el campo de texto: " . $cadenatexto . "<@br@><@br@>";
//datos del arhivo $nombre_archivo = $HTTP_POST_FILES['userfile']['name'];
$tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
$tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
//compruebo si las características del archivo son las correctas
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000)))
{
//Imprime en Pantalla
echo "La extensión o el tamaño de los archivos no es correcta. <@br@><@br@>Se permiten archivos .gif o .jpg
se permiten archivos de 100 Kb máximo.";

}else{
//Si se sube el archivo con éxito
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo))

{
//Imprime en Pantalla
echo "El archivo ha sido cargado correctamente.";
}

//al contrario
else
{
//Imprime en Pantalla
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
} }
?@
Recuerden quitar los "@" .


Analizando el uploader nos damos cuenta que el archivo filtra el tipo de archivo permitido que seria "gif" y "jpeg".


Como lograr subir algun archivo de otra extensión si esta filtrando las extinciones permitidas?




Transacciones HTTP


Una transacción HTTP está formada por un encabezado seguido, opcionalmente, por una línea en blanco y algún dato. El encabezado especificará cosas como la acción requerida del servidor, o el tipo de dato retornado, o el código de estado.


Para poder bypassear el uploader tenemos que controlar las cabeceras para cambiar la información al final.


Para eso Usare un Add-ons de Mozilla (Live HTTP Headers) para modificar las cabeceras al subir un archivo al servidor. Cuando lo Tengamos se auto-capturaran las cabeceras de las peticiones HTTP, una vez terminada la captura podemos Repetir las peticiones para modificarlas.

Herramientas > Live HTTP Headers




Una vez dentro de la edición de las cabeceras, podremos modificarlas.



Content-Disposition: form-data; name="uploadfile"; filename="fichero_1.jpg"
°
Content-Disposition: form-data; name="uploadfile"; filename="fichero_1.php"


Aquí nos muestra la información del formulario que es el nombre del input del upload y el nombre del archivo , modificamos filename para renombrar el archivo.



Una vez subido el archivo hay que averiguar donde esta alojado el archivo y acceder a el





No hay comentarios:

Publicar un comentario