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
  • Penjelasan
  • Melihat AndroidManifest.xml
  • Melihat Source Code
  • Mengakses Private Notes
  • Kesimpulan

Was this helpful?

  1. Challenges

Access Control Issues - Part 3

Exploiting Content Provider

PreviousAccess Control Issues - Part 2NextHardcoding Issues - Part 2

Last updated 4 years ago

Was this helpful?

Content Provider digunakan oleh suatu aplikasi (atau self-app) untuk mengakses data dari aplikasi lainnya.

Contoh: App-1 memiliki database SQLite. Beberapa data dari App-1 akan dibagian kepada App-2. Dengan menggunakan Content Provider, App-2 dapat mengambil data yang ada di dalam database SQLite dari App-1. Operasi yang bisa dilakukan mencakup seperti yang ada di database SQLite pada umumnya.

Penjelasan lebih lanjut tentang Content Provider bisa Anda baca .

Penjelasan

Bagian aplikasi yang akan kita bahas kali ini memiliki Activity yang menampilkan Private Notes. Untuk mengakses Private Notes kita harus menginputkan 4 Digit PIN yang valid. Kita akan mencoba untuk mengakses data Private Notes tersebut dari luar aplikasi.

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>

Terdapat Provider bernama NotesProvider, yang bisa dipanggil dengan atribut authorities="jakhar.aseem.diva.provider.notesprovider", dengan pengaturan exported="true" yang berarti diizinkannya akses dari aplikasi eksternal tanpa ada pembatasan.

Karena fitur Private Notes ini memiliki pengamanan berupa PIN yang dibuat oleh user, seharusnya aplikasi eksternal tidak bisa mengaksesnya.

Melihat Source Code

Sekarang mari kita cari Java class dimana Content Provider digunakan secara internal, yaitu pada file AccessControl3NotesActivity.java.

AccessControl3NotesActivity.class
package jakhar.aseem.diva;

import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class AccessControl3NotesActivity extends AppCompatActivity {
  public void accessNotes(View paramView) {
    EditText editText = (EditText)findViewById(2131492979);
    Button button = (Button)findViewById(2131492980);
    String str = PreferenceManager.getDefaultSharedPreferences((Context)this).getString(getString(2131099722), "");
    if (editText.getText().toString().equals(str)) {
      ((ListView)findViewById(2131492981)).setAdapter((ListAdapter)new SimpleCursorAdapter((Context)this, 2130968630, getContentResolver().query(NotesProvider.CONTENT_URI, new String[] { "_id", "title", "note" }, null, null, null), new String[] { "title", "note" }, new int[] { 2131493043, 2131493044 }, 0));
      editText.setVisibility(4);
      button.setVisibility(4);
      return;
    } 
    Toast.makeText((Context)this, "Please Enter a valid pin!", 0).show();
  }
  
  protected void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(2130968604);
  }
}

Perhatikan baris ke-21. Terdapat form query dengan parameter NotesProvider.CONTENT_URI, ini berarti ada class NotesProvider.java yang berisi nilai CONTENT_URI.

NotesProvider.java
...
...
public class NotesProvider extends ContentProvider {
  static final String AUTHORITY = "jakhar.aseem.diva.provider.notesprovider";
  static final Uri CONTENT_URI = Uri.parse("content://jakhar.aseem.diva.provider.notesprovider/notes");
...
...

Dengan informasi di atas kita bisa mengetahui nilai CONTENT_URI yang bisa diakses, yaitu content://jakhar.aseem.diva.provider.notesprovider/notes.

Mengakses Private Notes

Setelah mengetahui alamat atau nilai dari CONTENT_URI yang bisa diakses, kita akan mencoba untuk mendapatkan data dari Private Notes milik user menggunakan perintah berikut:

content query --uri content://jakhar.aseem.diva.provider.notesprovider/notes

Dan hasilnya isi dari Private Notes bisa diakses dari luar aplikasi dikarenakan pengaturan exported="true". Ini membuktikan aplikasi tersebut tidak menyimpan Private Notes dengan aman.

Hal ini bisa kita dilakukan pada perangkat yang tidak di-root.

Kesimpulan

Terdapat fitur Private Notes yang datanya bisa didapatkan dari luar aplikasi karena pengaturan provider exported="true" pada AndroidManifest.xml.

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

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

  • Jika Anda ingin membuat Content Provider agar data hanya bisa dibaca oleh aplikasi lain, pastikan untuk tidak memberikan izin untuk mengedit data (write).

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

CRUD
di sini
Sebelumnya
Tampilan Soal Access Control Issues - Part 3