Ya está:
http://127.0.0.1/tarea1.php?archivo=test.php&pass=123456<p>
-Que recoja una variable mediante $_GET["archivo"].
-Que recoja otra variable mediante $_GET["pass"].
-Que para continuar leyendo código se necesite una contraseña (123456).
-Que cree un archivo llamado $archivo0 y que, en caso de que exista, se llame $archivo1, $archivo2 ... y así sucesivamente (de forma que no se repita ningún archivo).
-Que dentro del archivo se escriba $archivo.
</p>
<?php
if(isset($_GET['archivo']) and
isset($_GET['pass'])){ /* Previene Disclosure y crackeo de colisiones */
if(md5(sha1($_GET['pass'])) == 'd93a5def7511da3d0f2d171d9c344e91'){ /* prevee LFI y carácteres inválidos. */
/* Separa el nombre de la extensión */
if($extension = explode('.', $file)){ $extension = $extension[count($extension) - 1]; }else{
$extension = '';
$full_filename = $file;
}
/* Ya existe un archivo renombrado con la misma extensión */
if($change = glob($full_filename.'_*.'.$extension)){ /* Obtiene el último archivo incrementado */
$full_filename = $change[count($change) - 1]; /* Elimina la extensión */
$full_filename = substr($full_filename, 0, (strlen($full_filename) - strlen($extension) - 1)); /* Obtiene el número incrementado */
$number = explode('_', $full_filename); $number = $number[count($number) - 1]; /* Cambia el nombre del archivo */
$full_filename .= (int)$number + 1; /* Incementa un valor */
file_put_contents($basepath.'/'.$full_filename.'.'.$extension, $full_filename.'.'.$extension);
}else{ /* No existe el archivo renombrado, lo creará... */
/* Crea el primer autoincrementado */
file_put_contents($basepath.'/'.$full_filename.'_0.'.$extension, $full_filename.'_0.'.$extension); }
}else{
}
}else{
echo '<p>Debe ingresar un nombre de archivo.</p>';
}
}else{
echo '<p>Contraseña inválida.</p>';
}
}
?>
<form method="get" action="?">
<input type="text" name="archivo" /> Nombre del archivo<br />
<input type="password" name="pass" /> Contraseña<br />
<input type="submit" />
</form>
Si ya existe un archivo le cambia solamente el número manteniendo la extensión y evitando lfi para que no pongan de nombre un "../../../../autoexec.bat".
También corregí el nombre del archivo y le agregué un hash en ves de pasar el password en texto plano porque si te hackean te revelan la contraseña, en cambio de esta forma no podrán obtener tu contraseña porque le hize doble codificación para evitar crackeos y colisiones.
De todas formas no me gustó el diseño del código, para mi eso es un mal diseño porque hubiera sudo mas fácil y mas corto poner un
archivo_md5(microtime())_.extension
y con eso no hubieras necesitado obtener numeros ni autoincrementar ni nada. de hecho así lo hace facebook, imageshack, etc.
Además el hacerlo via GET sin tokens es una muy mala practica ya que este código tiene xsrf por causa de su diseño ya que un ataque csrf via get es mucho mas facil de ejecutar que uno via post, por ejemplo:
<img src="http://127.0.0.1/tarea1.php?archivo=test.php&pass=123456" />
Cosa que no pasaría su estubiera via get.
En fin, yo me hubiera ahorrado mucho código y hacerlo mucho mas seguro si el diseño hubiera sido diferente.
Saludos.