Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: antoz en 2 Octubre 2011, 20:53 pm



Título: Ayuda con archivos PHP
Publicado por: antoz en 2 Octubre 2011, 20:53 pm
Hola tengo que crear un archivo PHP que cumpla las siguientes características:

-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.

Ahora bien, por si no me he explicado bien, lo que quiero es crear un archivo php que  recoja dos variables (archivo y pass) de la siguiente forma: http://ejemplo.com/aplicacion.php?archivo=EJEMPLO?pass=123456, que compruebe si la variable contraseña es 123456 para continuar ejecutando el código y de ser así, que se cree un archivo de texto que se llame como la variable archivo y un número más una unidad. $archivo0.txt, $archivo1.txt, $archivo2.txt... de forma que nunca se repitan los nombres de los archivos y se vayan creando nuevos.

Alguna sugerencia? Gracias de antemano.
Saludos


Título: Re: Ayuda con archivos PHP
Publicado por: antoz en 2 Octubre 2011, 21:45 pm
Esto es lo que tengo x ahora, pero no funciona:

Código:
<?
$archivo = $_GET["a"];
$password = $_GET["p"];
$nserie = $_GET["n"];
if ($password=="portoscanprivatebuild")
{
$abrir = "count.txt";
$abre = fopen($abrir, "r");
$total = fread($abre, filesize($abrir));
fclose($abre);
$abre = fopen($abrir, "w");
$total = $total + 1;
$grabar = fwrite($abre, $total);
fclose($abre);
$abrir2 = .$archivo. .$total. '.txt';
$fp = fopen($abrir2, "a");
$string = "Numero de serie de la unidad: ".$nserie.;
$write = fputs($fp, $string);
fclose($fp); 
}
else
{
echo "Error";
}
?>


Título: Re: Ayuda con archivos PHP
Publicado por: WHK en 2 Octubre 2011, 22:21 pm
dame un segundo y arreglo el código


Título: Re: Ayuda con archivos PHP
Publicado por: WHK en 2 Octubre 2011, 22:52 pm
Ya está:
http://127.0.0.1/tarea1.php?archivo=test.php&pass=123456

Código
  1. <p>
  2. -Que recoja una variable mediante $_GET["archivo"].
  3. -Que recoja otra variable mediante $_GET["pass"].
  4. -Que para continuar leyendo código se necesite una contraseña (123456).
  5. -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).
  6. -Que dentro del archivo se escriba $archivo.
  7. </p>
  8.  
  9. <?php
  10. $basepath = dirname(__file__);
  11. if(isset($_GET['archivo']) and isset($_GET['pass'])){
  12. /* Previene Disclosure y crackeo de colisiones */
  13. if(md5(sha1($_GET['pass'])) == 'd93a5def7511da3d0f2d171d9c344e91'){
  14. /* prevee LFI y carácteres inválidos. */
  15. if($file = preg_replace('|[^A-Za-z0-9_\.]|i', '', basename($_GET['archivo']).PHP_EOL)){
  16. if(file_exists($file)){
  17. /* Separa el nombre de la extensión */
  18. if($extension = explode('.', $file)){
  19. $extension = $extension[count($extension) - 1];
  20. $full_filename = substr($file, 0, (strlen($file) - strlen($extension) - 1));
  21. }else{
  22. $extension = '';
  23. $full_filename = $file;
  24. }
  25. /* Ya existe un archivo renombrado con la misma extensión */
  26. if($change = glob($full_filename.'_*.'.$extension)){
  27. /* Obtiene el último archivo incrementado */
  28. sort($change);
  29.  
  30. $full_filename = $change[count($change) - 1];
  31. /* Elimina la extensión */
  32. $full_filename = substr($full_filename, 0, (strlen($full_filename) - strlen($extension) - 1));
  33. /* Obtiene el número incrementado */
  34. $number = explode('_', $full_filename);
  35. $number = $number[count($number) - 1];
  36. /* Cambia el nombre del archivo */
  37. $full_filename = substr($full_filename, 0, (strlen($full_filename) - strlen($number)));
  38. $full_filename .= (int)$number + 1; /* Incementa un valor */
  39.  
  40. file_put_contents($basepath.'/'.$full_filename.'.'.$extension, $full_filename.'.'.$extension);
  41.  
  42. }else{ /* No existe el archivo renombrado, lo creará... */
  43. /* Crea el primer autoincrementado */
  44. file_put_contents($basepath.'/'.$full_filename.'_0.'.$extension, $full_filename.'_0.'.$extension);
  45. }
  46. }else{
  47. file_put_contents($basepath.'/'.$file, $file);
  48. }
  49. }else{
  50. echo '<p>Debe ingresar un nombre de archivo.</p>';
  51. }
  52. }else{
  53. echo '<p>Contraseña inválida.</p>';
  54. }
  55. }
  56. ?>
  57.  
  58. <form method="get" action="?">
  59. <input type="text" name="archivo" /> Nombre del archivo<br />
  60. <input type="password" name="pass" /> Contraseña<br />
  61. <input type="submit" />
  62. </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:
Código:
<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.


Título: Re: Ayuda con archivos PHP
Publicado por: antoz en 3 Octubre 2011, 16:04 pm
muchas gracias, es incluso mejor de lo que esperaba  :D