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
  • Membaca Database SQLite
  • Kesimpulan

Was this helpful?

  1. Challenges

Insecure Data Storage - Part 2

Unencrypted SQLite Database Storage Security Risk

PreviousInsecure Data Storage - Part 1NextInsecure Data Storage - Part 3

Last updated 4 years ago

Was this helpful?

Pendahuluan

Aplikasi Android bisa menggunakan SQLite untuk menyimpan data secara lokal sebagai Relation Database Management System (RDBMS). Database tersebut biasanya berisi detail user, log transaksi, atau lainnya tergantung developer.

File database SQLite secara default disimpan di dalam direktori aplikasi sanbox, yaitu: /data/data/AppPackageName/databases/. Bisa jadi developer menyimpan file tersebut di luar direktori databases, tetapi masih di dalam direktori .

Untuk mengidentifikasi file SQLite Anda harus mencari beberapa ekstensi umum seperti .sqlite, .db, atau terkadang tanpa ekstensi. Untuk memastikannya kita bisa menggunakan perintah pada shell.

Penjelasan

Melihat Source Code

InsecureDataStorage2Activity.class
package jakhar.aseem.diva;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class InsecureDataStorage2Activity extends AppCompatActivity {
  private SQLiteDatabase mDB;
  
  protected void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    try {
      this.mDB = openOrCreateDatabase("ids2", 0, null);
      this.mDB.execSQL("CREATE TABLE IF NOT EXISTS myuser(user VARCHAR, password VARCHAR);");
    } catch (Exception exception) {
      Log.d("Diva", "Error occurred while creating database: " + exception.getMessage());
    } 
    setContentView(2130968612);
  }
  
  public void saveCredentials(View paramView) {
    EditText editText1 = (EditText)findViewById(2131493003);
    EditText editText2 = (EditText)findViewById(2131493004);
    try {
      SQLiteDatabase sQLiteDatabase = this.mDB;
      StringBuilder stringBuilder = new StringBuilder();
      this();
      sQLiteDatabase.execSQL(stringBuilder.append("INSERT INTO myuser VALUES ('").append(editText1.getText().toString()).append("', '").append(editText2.getText().toString()).append("');").toString());
      this.mDB.close();
    } catch (Exception exception) {
      Log.d("Diva", "Error occurred while inserting into database: " + exception.getMessage());
    } 
    Toast.makeText((Context)this, "3rd party credentials saved successfully!", 0).show();
  }
}

Setelah menganalisa source code di atas, terlihat bahwa credentials yang diinputkan user disimpan secara lokal menggunakan database SQLite. File database ini diberi nama "ids2".

Membaca Database SQLite

Masuk ke direktori databases, lalu jalankan perintah berikut untuk membaca file database SQLite:

sqlite3 ids2 # membuka database ids2 dengan SQLite
.database # melihat database yang digunakan
.tables # melihat tables yang tersedia
SELECT * FROM myuser; # melihat semua record dari table myuser
.quit # keluar dari SQLite

Kesimpulan

Menyadari fakta-fakta di atas, terdapat beberapa rekomendasi yang bisa developer lakukan, diantaranya:

  • Tidak menyimpan informasi sensitif apa pun secara lokal.

  • Lakukan salting + hasing terlebih dahulu pada data sensitif sebelum disimpan.

  • Selalu gunakan autentikasi dalam pengaksesan database.

Bagian aplikasi yang akan kita bahas kali ini memiliki fitur untuk menyimpan credentials milik user. Dengan melakukan lalu menganalisis source code, kita akan mencari tahu bagaimana credentials tersebut disimpan.

Kita telah berhasil mengakses file database dan mendapatkan credentials milik user. Ini membuktikan bahwa aplikasi ini tidak menyimpan credentials dengan aman. Password disimpan secara plaintext, bahkan tidak adanya dalam mengakses file database SQLite.

Meskipun file database SQLite dilindungi oleh , namun ada beberapa catch yang bisa membatalkan mekanisme perlindungan tersebut seperti yang .

Selain itu, tidak ada pengamanan untuk file database SQLite seperti , sehingga kita bisa dengan mudah membuka database tersebut.

Menggunakan bisa menjadi pilihan untuk menyimpan kunci enkripsi dengan aman bahkan pada rooted device.

reverse engineering
pengamanan
penggunaan password
Android Keystore
sanbox
file
sandbox
dijelaskan sebelumnya
Tampilan Soal Insecure Data Storage - Part 2