¿Se pueden ver todos los ficheros de una web?

-suikEVIL_

Hola,

Me gustaría saber si un atacante puede descargarse los ficheros situados en un servidor web.

Tengo una web que funciona sobre tomcat. En la carpeta dedicada a esa web tengo imágenes, html, css y ficheros xml. Mi temor va encaminada a los xml. Digamos que tengo un archivo llamado "gestion_email.xml" en el que tengo ciertas características necesarias para que el servidor web pueda enviar correos electrónicos, entre las que se encuentra la dirección y contraseña de la cuenta que utiliza la empresa X para comunicarse con sus clientes.

-Si la dirección de la web es la siguiente http:\localhost:8080\miWeb un atacante podría ver el fichero xml citado anteriormente de la siguiente manera http:\localhost:8080\miWeb\gestion_email.xml, no obstante, esto no me preocupa ya que el atacante debe de conocer la ruta del xml y con poner un nombre con números, letras y signos a ese fichero xml me vale.

-Mi duda es si ¿hay alguna forma con algún programa/script que permita a un atacante descargarse todos los ficheros de mi web bajo Tomcat?. He probado con varios programas y sólo he "conseguido" descargarme imágenes, css y html de mi propia web pero desconozco si hay alguna forma en la que un atacante sí que pueda hacerlo.

Muchas gracias a todos y perdonad por el tochazo

-suikEVIL_

Admito cual comentario ;-)

Beavis

Si no está linkado en ningún sitio y tienes los índices de directorio desactivados en principio no sería posible averiguarlo teniendo acceso a la web únicamente (sin entrar a considerar la fuerza bruta).
Ahora bien independientemente de ésto la seguridad por oscuridad nunca es algo bueno, yo buscaría alternativas. No puedes sacar esos archivos del documentroot o denegar sistemáticamente su acceso con la configuración del server? No estoy familiarizado con tomcat pero en apache es muy fácil de hacer con una simple regla en el .htaccess

2 respuestas
OleMoudi

me sumo a lo que ha dicho #3

Teóricamente una ruta o nombre de archivo impredecible puede actuar de la misma forma que un password, pero al estar guardando ese "password" en un lugar que no está pensado para ello, las posibilidades de que se filtre y sea descubierto se multiplican: logs, scripts con la ruta hardcoded, backups...

-suikEVIL_

El tema es que la empresa X quiere que el tema de los datos del correo electrónico esté en un xml en el servidor. Sé que poner un nombre largo con números/letras/signos es una "guarrada" pero es lo primero que se me ha ocurrido. De todas formas estoy siguiendo las instrucciones de #3 para ver que encuentro

NeB1

Es algo de los realm's en tomcat, para limitar el acceso a ciertos archivos. también puedes hacer algo en jsp que compruebe que estás logueado y si es así, genere el xml.

en PHP (no sé de JSP) sería algo así

gestion_correo.php

<?php
if($_SESSION['autentificado'] != true)
    header("Location:login.php");
else
    echo '<xml><cosa>hola</cosa></xml>';
JuAn4k4

Metelo en WEB-INF o en META-INF y ya se encarga el Tomcat de que no lo vea nadie.

Normalmente se suele poner las clases en :
WEB-INF/classes/

en lib las librerías
WEB-INF/lib

en META-INF los ficheros de configuración (y también en el classpath , el directorio classes de antes.)

y en resources lo estático:

resources/css
resources/js
resources/static/html

El 'atacante' no podrá ir a
http://localhost:8080/path/WEB-INF/....

peri si a
http://localhost:8080/path/resources

Lo que estás buscando es esto:

http://www.servletworld.com/servlet-tutorials/web-application-directory-structure.html

The root directory of the application is called the document root. Root directory is mapped to the context path. Root directory contains a directory named WEB-INF. Anything under the root directory excepting the WEB-INF directory is publically available, and can be accessed by URL from browser. WEB-INF directory is a private area of the web application, any files under WEB-INF directory cannot be accessed directly from browser by specifying the URL like http://somesite/WEB-INF/someresource.html.

PD: Yo diria que el META-INF tampoco.. aunque el META-INF suele ponserse en WEB-INF/classes/META-INF para que esté en el classpath.

1 respuesta
-suikEVIL_

Muchísimas gracias a todos, y en particular a #7 ya que he leido exáctamente lo que necesitaba.

1º He colocado gestion_email.xml en la siguiente ruta relativa war/WEB-INF/classes/META-INF/config.
2º Desde el servidor accedo al fichero xml a través de la siguiente sentencia:
String pathAbsoluto = this.getServletContext().getRealPath("/") + "/WEB-INF/classes/META-INF/config" + NOMBRE_FICHERO_EMAIL_XML;
donde NOMBRE_FICHERO_EMAIL_XML es una constante con el nombre del fichero en cuestión.

Muchísimas gracias de nuevo ;-)

JuAn4k4

Es mejor que accedas al fichero a traves del classloader, como un classpath resource

Ahora te pongo como, si estas utilizando Spring también puedes hacerlo con el ResourceLoader, que te carga Resources (InputStream) ya sean ficheros o urls
Con la siguiente ruta : "classpath:META-INF/config.xml"

Para hacerlo tu mismo:

para cojer el classloader:

public static ClassLoader getDefaultClassLoader() {
		ClassLoader cl = null;
		try {
			cl = Thread.currentThread().getContextClassLoader();
		}
		catch (Throwable ex) {
			// Cannot access thread context ClassLoader - falling back to system class loader...
		}
		if (cl == null) {
			// No thread context class loader -> use class loader of this class.
			cl = this.getClass().getClassLoader();
		}
		return cl;
	}

y luego con el classloader

InputStream is =getDefaultClassLoader().getResourceAsStream("META-INF/file.xml");

Utilizando Spring tienes que hacer esto.


public class ClaseQueConfigura implements ResourceLoaderAware {

private ResourceLoader resourceLoader;

@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
    this.resourceLoader = resourceLoader;
}

private InputStream myFicheroXml;

public InputStream getFicheroXmlBonito() {
   if (myFicheroXml == null) {
      myFicheroXml = resourceLoader.getResource("classpath:META-INF/file.xml");
   } 
   return myFicheroXml;
   }
}

-suikEVIL_

Estoy usando Google Web Toolkit.

Pero, ¿por qué dices que es mejor acceder a través del classloader?

Un saludo

JuAn4k4

Porque el recurso al que intentas acceder esta en el classpath, y para eso está el classloader

Si por ejemplo, empaquetas tu aplicación en un .war, lo que tu haces dejará de funcionar (bueno en realidad no porque lo desempaqueta solo...) pero vamos que... mejor utiliza el classloader que para eso está, para cargar recursos del classpath.

http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream

Usuarios habituales

  • JuAn4k4
  • -suikEVIL_
  • NeB1
  • OleMoudi
  • Beavis