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
  • Melihat Source Code Asli
  • Memanggil Intent
  • Kesimpulan

Was this helpful?

  1. Challenges

Access Control Issues - Part 2

Access Control Bypass using Intents with Data

PreviousAccess Control Issues - Part 1NextAccess Control Issues - Part 3

Last updated 4 years ago

Was this helpful?

Pendahuluan

Sama seperti kita akan memanggil Activity dari luar aplikasi, hanya saja kali ini kita akan menggunakan data untuk mem-bypass access control yang ada.

Penjelasan

Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan API Credentials. Untuk menampilkan API Credentials tersebut kita harus memilih opsi "Already Registered" terlebih dahulu baru menekan button "VIEW TVEETER API CREDENTIALS". Kita akan mencari tahu apakah Activity tersebut bisa diakses dari luar aplikasi atau tidak.

Melihat Source Code

AccessControl2Activity.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.RadioButton;
import android.widget.Toast;

public class AccessControl2Activity extends AppCompatActivity {
  protected void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(2130968602);
  }
  
  public void viewAPICredentials(View paramView) {
    RadioButton radioButton = (RadioButton)findViewById(2131492973);
    Intent intent = new Intent();
    boolean bool = radioButton.isChecked();
    intent.setAction("jakhar.aseem.diva.action.VIEW_CREDS2");
    intent.putExtra(getString(2131099686), bool);
    if (intent.resolveActivity(getPackageManager()) != null) {
      startActivity(intent);
      return;
    } 
    Toast.makeText((Context)this, "Error while getting Tveeter API details", 0).show();
    Log.e("Diva-aci1", "Couldn't resolve the Intent VIEW_CREDS2 to our activity");
  }
}

Perhatikan fungsi viewAPICredentials(). Ketika opsi (radio button) diisi lalu button "VIEW TVEETER API CREDENTIALS" ditekan, maka Intents akan memanggil Activity VIEW_CREDS2 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>

Melihat Source Code Asli

am start jakhar.aseem.diva/.APICreds2Activity 
APICreds2Activity.java
Intent i = getIntent();
boolean bcheck = i.getBooleanExtra(getString(R.string.chk_pin), true);

if (bcheck == false) {
   // Connect to vendor cloud and send User PIN
   // Get API credentials and other confidential details of the user
   String apidetails = "TVEETER API Key: secrettveeterapikey\nAPI User name: diva2\nAPI Password: p@ssword2";
   // Display the details on the app
   apicview.setText(apidetails);
}
else {
   apicview.setText("Register yourself at http://payatu.com to get your PIN and then login with that PIN!");
   pintext.setVisibility(View.VISIBLE);
   vbutton.setVisibility(View.VISIBLE);
}

Baris ke-4 hingga 15: terdapat validasi jika bcheck bernilai false, maka Activity tersebut akan menampilkan API Credentials. Sedangkan jika bernilai true, maka akan menampilkan form register.

Memanggil Intent

Karena kita harus membuat nilai check_pin menjadi false, maka kita akan gunakan perintah seperti berikut:

am start -a jakhar.aseem.diva.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false

Keterangan:

  • start -a jakhar.aseem.diva.VIEW_CREDS2 mendefinisikan Action (bisa dilihat di file AndroidManifest.xml)

  • -n jakhar.aseem.diva/.APICreds2Activity menentukan Activity yang dijalankan.

  • –ez check_pin false mengisi nilai false pada identifier check_pin

    • –ez = data boolean

    • -es = data string

    • –ei = data integer

    • –el = data long

    • –ef = data float

    • –eu = data URI

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.

  • Tidak hanya melakukan validasi pada sisi client, tetapi juga pada sisi server.

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

Perhatikan pada baris ke-28 hingga 33. Activity APICreds2Activity memiliki Intent untuk memanggil Activity VIEW_CREDS2 dengan Category DEFAULT yang berarti bahwa Activity VIEW_CREDS2 bisa dan akan dimuat pertama kali ketika Activity APICreds2Activity dipanggil.

Pengaturan untuk Activity APICreds2Activity pada AndroidManifest.xml memang terlihat sama seperi Activity APICredsActivity yang telah kita bahas sebelumnya. Tetapi jika kita memanggil Activity APICreds2Activity seperti cara , maka yang akan tampil adalah form untuk register.

Alasanya bisa kita cek di , seperti berikut:

Baris ke-2: i.getBooleanExtra(...) yang berarti Intent bergantung nilai boolean dari variabel bcheck. Dan chk_pin adalah singkatan dari "check_pin" (bisa Anda lihat di file ).

diakses dari luar aplikasi
source code aslinya
strings.xml
sebelumnya
Sebelumnya
Tampilan Soal Access Control Issues - Part 2
Memanggil Intent VIEW_CREDS2
sebelumnya