DIVA Android
  • Damn Insecure and Vulnerable App (DIVA)
  • Pendahuluan
    • Persiapan
    • Konfigurasi Burp Suite dengan Android
    • Instalasi Aplikasi DIVA
  • Reversing of APK
    • Decompiling dan Reversing APK
  • Challenges
    • Insecure Logging
    • Hardcoding Issues - Part 1
    • Insecure Data Storage - Part 1
    • Insecure Data Storage - Part 2
    • Insecure Data Storage - Part 3
    • Insecure Data Storage - Part 4
    • Input Validation Issues - Part 1
    • Input Validation Issues - Part 2
    • Access Control Issues - Part 1
    • Access Control Issues - Part 2
    • Access Control Issues - Part 3
    • Hardcoding Issues - Part 2
    • Input Validation Issues - Part 3
Powered by GitBook
On this page
  • Pendahuluan
  • Penjelasan
  • Melihat Source Code
  • Melihat AndroidManifest.xml
  • Memanggil Intent
  • Kesimpulan

Was this helpful?

  1. Challenges

Access Control Issues - Part 1

Access Control Bypass using Intents

PreviousInput Validation Issues - Part 2NextAccess Control Issues - Part 2

Last updated 4 years ago

Was this helpful?

Pendahuluan

Activity adalah komponen yang dapat dilihat oleh pengguna, sehingga mereka dapat berinteraksi dengan aplikasi.

Bila dibandingkan dengan aplikasi web dan desktop, Activity sama seperti halaman dan form.

Android

Web

Desktop

Activity

Halaman

Form

Penjelasan lebih lanjut tentang Activity bisa Anda baca .

Intent adalah sebuah kelas dalam programming Android yang berfungsi untuk perpindahan halaman.

Intent juga merupakan suatu objek yang terdapat dalam suatu activity dimana objek tersebut dapat berkomunikasi dengan activity yang lain, baik activity pada fungsi internal android misal seperti memanggil activity dalam satu package atau beda package yang masih berada dalam satu project.

Intent dibagi menjadi 2, yaitu :

  1. Explicit Intent berfungsi untuk mengaktifkan komponen-komponen dalam satu aplikasi yang sama. Misalnya seperti: berpindah Activity.

  2. Implicit Intent berfungsi untuk memanggil fungsi activity yang sudah ada di fungsi internal Android seperti Dial Number, Open Browser dan lainnya.

Penjelasan lebih lanjut tentang Intents bisa Anda baca .

Penting untuk mempertimbangkan apakah aplikasi eksternal bisa mengakses Activitiy yang ada pada aplikasi kita atau tidak.

Katakanlah kita memiliki Activity yang di dalamnya terdapat informasi sensitif, maka dari itu seharusnya kita tidak mengizinkan aplikasi lain untuk mengakses Activity tersebut. Hal ini bisa dilakukan dengan membatasi akses melalui Intent Filter pada AndroidManifest.xml. File berisi detail untuk semua Activity termasuk untuk menerapkan Intent Filter.

Penjelasan

Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan API Credentials. Kita akan mencari tahu apakah Activity ini bisa diakses dari luar aplikasi atau tidak.

Melihat Source Code

AccessControl1Activity.class
package jakhar.aseem.diva;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class AccessControl1Activity extends AppCompatActivity {
  protected void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(2130968601);
  }
  
  public void viewAPICredentials(View paramView) {
    Intent intent = new Intent();
    intent.setAction("jakhar.aseem.diva.action.VIEW_CREDS");
    if (intent.resolveActivity(getPackageManager()) != null) {
      startActivity(intent);
      return;
    } 
    Toast.makeText((Context)this, "Error while getting API details", 0).show();
    Log.e("Diva-aci1", "Couldn't resolve the Intent VIEW_CREDS to our activity");
  }
}

Perhatikan fungsi viewAPICredentials(). Ketika kita menekan button "VIEW API CREDENTIALS" maka Intents akan memanggil Activity VIEW_CREDS yang akan menampilkan API credentials.

Melihat AndroidManifest.xml

Berikut adalah file AndroidManifest.xml dari aplikasi diva:

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jakhar.aseem.diva" platformBuildVersionCode="23" platformBuildVersionName="6.0-2166767">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:allowBackup="true" android:debuggable="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:label="@string/app_name" android:name="jakhar.aseem.diva.MainActivity" android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:label="@string/d1" android:name="jakhar.aseem.diva.LogActivity"/>
        <activity android:label="@string/d2" android:name="jakhar.aseem.diva.HardcodeActivity"/>
        <activity android:label="@string/d3" android:name="jakhar.aseem.diva.InsecureDataStorage1Activity"/>
        <activity android:label="@string/d4" android:name="jakhar.aseem.diva.InsecureDataStorage2Activity"/>
        <activity android:label="@string/d5" android:name="jakhar.aseem.diva.InsecureDataStorage3Activity"/>
        <activity android:label="@string/d6" android:name="jakhar.aseem.diva.InsecureDataStorage4Activity"/>
        <activity android:label="@string/d7" android:name="jakhar.aseem.diva.SQLInjectionActivity"/>
        <activity android:label="@string/d8" android:name="jakhar.aseem.diva.InputValidation2URISchemeActivity"/>
        <activity android:label="@string/d9" android:name="jakhar.aseem.diva.AccessControl1Activity"/>
        <activity android:label="@string/apic_label" android:name="jakhar.aseem.diva.APICredsActivity">
            <intent-filter>
                <action android:name="jakhar.aseem.diva.action.VIEW_CREDS"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:label="@string/d10" android:name="jakhar.aseem.diva.AccessControl2Activity"/>
        <activity android:label="@string/apic2_label" android:name="jakhar.aseem.diva.APICreds2Activity">
            <intent-filter>
                <action android:name="jakhar.aseem.diva.action.VIEW_CREDS2"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <provider android:authorities="jakhar.aseem.diva.provider.notesprovider" android:enabled="true" android:exported="true" android:name="jakhar.aseem.diva.NotesProvider"/>
        <activity android:label="@string/d11" android:name="jakhar.aseem.diva.AccessControl3Activity"/>
        <activity android:label="@string/d12" android:name="jakhar.aseem.diva.Hardcode2Activity"/>
        <activity android:label="@string/pnotes" android:name="jakhar.aseem.diva.AccessControl3NotesActivity"/>
        <activity android:label="@string/d13" android:name="jakhar.aseem.diva.InputValidation3Activity"/>
    </application>
</manifest>

Memanggil Intent

Kita akan mencoba untuk memanggil Activity APICredsActivity. Untuk melakukan hal ini kita tidak memerlukan perangkat yang di-root.

Dengan masuk ke ADB Shell dan menggunakan perintah am (Activity Manager) kita akan memanggil Activity tersebut, seperti berikut:

am start jakhar.aseem.diva/.APICredsActivity

Maka akan tampil Activity VIEW_CREDS seperti berikut:

Tampilnya Activity VIEW_CREDS membuktikan bahwa Activity yang menyimpan informasi sensitif tersebut bisa diakses dari luar aplikasi.

Kesimpulan

Terdapat Activity yang menyimpan informasi sensitif dapat dipanggil dari luar aplikasi karena pengaturan Intent Filter yang buruk.

Menyadari fakta tersebut, terdapat beberapa rekomendasi yang bisa developer lakukan, diantaranya:

  • Mengatur action dan category yang benar pada Intent Filter.

  • Jangan pernah menggunakan exported="true" pada file AndroidManfiest.xml, kecuali Anda paham dengan apa yang Anda lakukan.

kita telah mempelajari cara mendapatkan file AndroidManifest.xml dari suatu APK.

Perhatikan pada baris ke-21 hingga 26. Activity APICredsActivity memiliki Intent untuk memanggil Activity VIEW_CREDS dengan Category DEFAULT yang berarti bahwa Activity VIEW_CREDS bisa dan akan dimuat pertama kali ketika Activity APICredsActivity dipanggil.

diakses dari luar aplikasi
di sini
di sini
Sebelumnya
AndroidManifest.xml
Tampilan Soal Access Control Issues - Part 1
Tampilan Activity yang diakses dari luar aplikasi