Pengujian penetrasi keamanan aplikasi Android dilakukan terhadap AndroGoat dengan fokus pada identifikasi potensi kerentanan pada aplikasi, pembuatan Proof of Concept (PoC), analisis dampak risiko yang mungkin ditimbulkan, serta penyusunan rekomendasi mitigasi yang mengacu pada praktik terbaik Mobile App Security.

Metodologi pengujian mencakup kombinasi pendekatan Static Application Security Testing (SAST) dan Dynamic Application Security Testing (DAST) dengan mengacu pada standar OWASP Mobile Application Security Verification Standard (MASVS) serta panduan pengujian dari Mobile Security Testing Guide (MSTG). Proses pengujian dilakukan pada environment yang merepresentasikan kondisi mendekati produksi (production like), dengan asumsi threat model di mana penyerang memiliki kemampuan melakukan analisis statis dan dinamis, termasuk upaya bypass terhadap mekanisme proteksi aplikasi.

AndroGoat adalah aplikasi open source yang sengaja dibuat rentan menggunakan Kotlin untuk tujuan pembelajaran keamanan. Aplikasi ini membantu profesional dan developer memahami serta menguji vulnerability pada platform Android, sehingga cocok untuk mempelajari keamanan aplikasi Android modern. Source aplikasi: AndroGoat by satishpatnayak

Tools yang digunakan pada pengujian kali ini adalah sebagai berikut: 1. Android Debug Bridge (ADB) 2. JADX 3. Mobile Security Framework (MobSF) 4. Frida 5. ApkTool 6. Uber-Apk-Signer 7. Burp Suite

Berikut temuan celah kerentanan pada aplikasi AndroGoat v1.0:

  1. Debuggable Enabled
  2. Exported Components
  3. Insecure Local Storage
  4. Insecure External Storage
  5. Hardcoded Secret Credential
  6. Hardcoded Promo Code
  7. Root Detection Bypass
  8. Emulator Detection Bypass
  9. Insecure HTTP Communication
  10. SSL Pinning Bypass
  11. Binary Patching
  12. SQL Injection

DISCLAIMER!

Artikel ini disusun untuk tujuan pembelajaran Android Penetration Testing. Seluruh teknik dan informasi yang disampaikan hanya boleh digunakan pada sistem atau aplikasi yang dimiliki sendiri atau telah memperoleh izin resmi dari pemiliknya. Penulis tidak bertanggung jawab atas segala bentuk penyalahgunaan informasi di luar konteks pembelajaran dan penggunaan yang sah secara hukum.

1. Debuggable Enabled

Status debuggable AndroGoat pada AndroidManifest.xml bernilai True.

None

Kondisi ini merupakan bentuk misconfiguration yang memungkinkan aplikasi untuk di debug pada environment Production. Hal ini membuka peluang bagi attacker untuk melakukan analisis dinamis terhadap aplikasi, termasuk inspeksi runtime behavior dan interaksi dengan komponen internal aplikasi, memodifikasi alur eksekusi, serta melakukan hooking terhadap method tertentu menggunakan tools seperti debugger atau dynamic instrumentation framework. Terdapat banyak cara dalam memanfaatkan celah pada debugging yang aktif.

Proof of Concept

Cara pertama, jika kita menggunakan Android Debug Bridge (ADB) dan menjalankan command berikut pada terminal:

adb shell run-as owasp.sat.agoat

Maka kita akan masuk ke direktori aplikasi dan dapat melihat semua data dari AndroGoat seperti pada gambar berikut.

None

Cara kedua, menggunakan Java Debug Wire Protocol (JDWP), yaitu dengan menjalankan command berikut pada terminal:

adb jdwp

Maka akan menampilkan list Process ID (PID) dari semua aplikasi yang saat ini sedang berjalan di perangkat Android dan mendukung protokol debugging Java.

Selanjutnya untuk memastikan PID dari AndroGoat adalah dengan menjalankan command berikut:

adb shell ps | grep owasp.sat.agoat

Maka akan terlihat PID nya yaitu 4333

None

Kemudian forward port agar debugger ter-attach:

adb forward tcp:8700 jdwp:4333

Selanjutnya menjalankan jdb:

jdb -attach localhost:8700

Maka akan segera masuk ke interactive debugger:

None

Disini kita bisa menjalankan banyak opsi debugging seperti melihat struktur class, field, dan method, mengontrol eksekusi program, menetapkan breakpoint, serta modifikasi nilai variabel pada saat runtime. Namun kita hanya akan melihat class, methods dan fields dari source code AndroGoat.

classes

Maka akan keluar semua class yang loaded saat runtime pada aplikasi AndroGoat.

Untuk melihat fields pada class tertentu dapat menjalankan command berikut:

fields owasp.sat.agoat.AccessControl1ViewActivity

Maka akan keluar semua fields dari activity tersebut.

None

Selain itu, kita juga bisa melihat methods dari class tertentu, thread yang berjalan, dan berbagai perintah lain dalam melakukan debugging menggunakan jdb.

Lalu bagaimana solusi nya agar terhindar dari kerentanan tersebut?

Berbagai upaya dapat dilakukan sebagai mitigasi terhadap resiko yang timbul akibat konfigurasi debugging yang aktif, cara yang paling basic adalah dengan set android:debuggable pada AndroidManifest.xml menjadi False, selain itu dapat juga mengubah status debuggable menjadi False pada buildtype release di Gradle.

buildTypes { 
  getByName("release") { 
    debuggable = false 
  } 
}

Selain itu sebagai upaya lebih lanjut untuk mencegah upaya reverse engineering, dapat mengaktifkan proses code obfuscation & shrinking dengan menambahkan beberapa flag pada Gradle seperti berikut:

android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

Maka proguard akan melakukan obfuskasi ketika build aplikasi sehingga naming pada tiap class maupun code akan tersamarkan sehingga mempersulit attacker dalam upaya penyerangan. Selain itu proses shrinking akan menghapus class maupun resources yang tidak digunakan sehingga size aplikasi akan lebih kecil.

Selain itu, dapat diterapkan mekanisme anti debugging untuk mendeteksi dan mencegah proses attach debugger pada aplikasi saat runtime, sehingga memperkecil peluang eksploitasi melalui teknik dynamic analysis.

2. Exported Components

Sebagaimana yang kita ketahui, Android Component adalah building block utama aplikasi Android. Semua app android di bangun pada komponen2 tsb. Terdapat 4 komponen utama, yaitu Activity, Broadcast Receiver, Service, dan Content Provider.

Jika kita lakukan analisis statis dengan decompile apk AndroGoat menggunakan JADX, dapat dilihat di file AndroidManifest.xml bahwa pada beberapa android component status exported nya masih bernilai True dan tanpa permission, hal ini merupakan celah untuk dapat dilakukan bypass dari luar aplikasi. Activity yang memiliki status exported true yaitu: AccessControl1ViewActivity, ContentProviderActivity, dan SplashActivity. Kemudian broadcast receiver yang exported adalah ShowDataReceiver, dan ProfileInstallReceiver. Service yang exported adalah DownloadInvoiceService. Selain itu, Content Provider yang exported adalah userpinsprovider.

None
None
None

Akibat dari status exported True pada android component adalah dapat dilakukan bypass dari luar aplikasi ke komponen exported tesebut. Berikut upaya bypass yang bisa dilakukan.

Proof of Concept Exploit

Bypass Activity:

adb shell am start owasp.sat.agoat/.AccessControl1ViewActivity

Maka aplikasi akan langsung membuka halaman tsb tanpa permission.

Bypass Content Provider:

adb shell content query --uri content://owasp.sat.agoat.provider.userpinsprovider/user_pins

Maka data yang tersimpan pada provider akan terbuka

None

Bypass Service:

Berdasarkan hasil analisis menggunakan JADX pada class DownloadInvoiceService, ditemukan bahwa service tersebut menjalankan proses download file invoice berformat .txt dengan memanfaatkan DownloadManager dan melakukan request ke hardcode URL dalam aplikasi.

None

Celah Service yang exported tsb dapat ter bypass dengan menjalankan command berikut:

 adb shell am startservice owasp.sat.agoat/.DownloadInvoiceService

Maka Service yang berada di DownloadInvoiceService langsung berjalan dan file segera terunduh.

None
None

Bypass Broadcast Receiver:

adb shell am broadcast owasp.sat.agoat/.ShowDataReceiver

Maka aplikasi akan langsung mengirim broadcast intent secara langsung ke receiver ShowDataReceiver, dan pada class tsb terdapat Toast yang memunculkan pesan sensitif seperti pada gambar berikut:

None

Dampak dari konfigurasi ini adalah memungkinkan pihak eksternal untuk mengakses atau mengeksekusi komponen internal aplikasi tanpa mekanisme autentikasi atau otorisasi yang memadai, yang berpotensi menyebabkan kebocoran data maupun penyalahgunaan fungsi aplikasi.

Untuk mencegah upaya bypass dari luar aplikasi adalah dengan mengatur nilai Exported pada tiap Component di AndroidManifest menjadi False. Selain itu juga dapat diberikan mekanisme permission untuk tiap upaya akses komponen, sehingga menyulitkan attacker

3. Insecure Local Storage

Sebuah aplikasi memiliki berbagai mekanisme penyimpanan data yaitu melalui server dan client. Penyimpanan dari sisi client pada aplikasi Android berpotensi menjadi sebuah kerentanan, karena local storage tidak memiliki protocol seperti cloud storage yang dapat membantu menjaga setiap komunikasi yang berjalan, terlebih jika tidak ada upaya enkripsi dalam menyimpan tiap data pada client.

Seperti pada AndroGoat terdapat penyimpanan data local yang tidak aman dan tidak ada validasi atau permission untuk mengakses nya. Hal ini dapat diupayakan dengan membaca database local menggunakan adb dengan membuka shell pada device:

adb shell

Masuk direktori AndroGoat

cd data/data/owasp.sat.agoat/
ls

Maka dapat terlihat semua files yang tersimpan

None

Dari semua data itu, attacker dapat membuka satu per satu data yang tersimpan dan berpotensi disalahgunakan. Kita coba masuk direktori shared_prefs, yang mana itu adalah direktori yang menyimpan data local menggunakan mekanisme Shared Preferences. Di dalam nya terdapat data berikut:

None

Jika kita buka salah satu file nya dengan menjalankan command berikut:

cat users.xml

Maka akan terungkap semua data dari users, dalam case ini adalah username dan password.

None

Sebagai solusi atas kerentanan tsb, maka dapat diupayakan dengan berbagai cara antara lain yaitu penggunaan EncryptedSharedPreferences, enkripsi database menggunakan SQLCipher jika diperlukan, serta disable auto backup jika menyimpan data sensitif.

4. Insecure External Storage

Penyimpanan data pada external storage seperti SD Card juga dapat menjadi celah kerentanan jika tidak ada permission ataupun proteksi untuk mengakses nya. Pada AndroGoat hal ini juga menjadi temuan, dimana data pada sdcard dapat diakses dan dibuka langsung hanya menggununakan adb dan masuk ke direktori nya, seperti pada command berikut:

adb shell 
cd /sdcard/Android/data/owasp.sat.agoat/files
ls
cat <spesific-data>

Maka akan terbuka data tsb

None

Terkait temuan tsb, direkomendasikan untuk tidak menyimpan data sensitif pada external storage, jika memang harus external maka lakukan enkripsi atau berikan permission sebelum storing data pada external storage.

5. Hardcode Secret Credential

Celah berikutnya adalah terdapat sebagian value confidential yang disimpan secara hardcode dari sisi client aplikasi. Setelah dilakukan decompile apk menggunakan JADX, dapat dilihat terdapat key yang terungkap dan berpotensi disalahgunakan yaitu AWS key dan OpenAI key pada CloudServiceActivity dan AIChatActivity.

None
None

Hardcoding API key milik OpenAI maupun AWS Access Key di dalam aplikasi mobile merupakan praktik yang sangat berbahaya karena aplikasi client berada di lingkungan yang sepenuhnya dapat dikontrol oleh pengguna atau penyerang, sehingga kredensial tersebut hampir pasti dapat diekstraksi. OpenAI API key yang bocor dapat disalahgunakan untuk melakukan permintaan API tanpa batas hingga menimbulkan kerugian finansial akibat pembengkakan biaya penyalahgunaan layanan AI atas nama pemilik akun, sedangkan AWS Access Key bisa lebih berbahaya karena berpotensi memberikan akses langsung ke infrastruktur cloud seperti S3, database, atau resource komputasi, hal ini dapat berujung pada kebocoran data massal, penghapusan aset, hingga penyalahgunaan resource untuk aktivitas ilegal.

Mitigasi terbaik terkait case ini adalah dengan tidak pernah menyimpan kredensial rahasia di sisi client dan memindahkan seluruh komunikasi sensitif melalui backend server yang aman (server side proxy) dan dapat menyimpan secret di environment server atau secret manager.

6. Hardcode Promo Code

Kode promo merupakan data sensitif yang mesti disimpan dan dipakai dengan mekanisme yang aman. Keterbukaan value dari kode promo dapat mempermudah user menyalahgunakan nya sehingga perusahaan mengalami kerugian atas potongan harga tsb. Terdapat promo code yang disimpan secara hardcode pada client yaitu pada HardcodeActivity.

None

Jika kita coba menggunakan kode promo tersebut pada fitur belanja, maka promo berhasil digunakan dan harga berhasil terpotong.

None

Cara terbaik untuk mengatasi permasalahan tsb adalah dengan menghindari validasi promo sepenuhnya di sisi client, dapat melakukan validasi promo code di server side, dan implementasikan signature atau token validation.

7. Bypass Root Detection

Pada aplikasi AndroGoat terdapat beberapa pengecekan environment dari device yang menjalankan nya, salah satu nya adalah deteksi Root device. Pengecekan Root ada pada halaman RootDetectionActivity, jika kita decompile apk nya menggunakan JADX dan melihat isi dari class tsb maka terlihat logic pengecekan nya.

None

Root detection di class ini bekerja dengan dua pendekatan sederhana: method isRooted() melakukan pengecekan keberadaan file file yang umum ada pada device root dengan melakukan iterasi terhadap daftar path seperti /system/xbin/su, /system/bin/su, /su/bin/su, Superuser/SuperSU APK, hingga Xposed installer, lalu mengembalikan nilai True jika salah satu file tersebut ada. Sedangkan method isRooted1() mencoba mengeksekusi perintah su melalui Runtime.getRuntime().exec() dan jika perintah tersebut berhasil dijalankan tanpa melempar IOException maka dianggap perangkat memiliki binary su (berarti root).

Setelah memahami logic pengecekan Root, maka kita dapat membuat script menggunakan javascript yang akan membalik kan nilai pada method pengecekan tsb untuk kemudian dilakukan bypass Root detection menggunakan Frida.

Java.perform(function () {

    var RootDetectionActivity = Java.use("owasp.sat.agoat.RootDetectionActivity");

    // Override isRooted()
    RootDetectionActivity.isRooted.implementation = function () {
        console.log("[+] isRooted() called -> forcing false");
        return false;
    };

    // Override isRooted1()
    RootDetectionActivity.isRooted1.implementation = function () {
        console.log("[+] isRooted1() called -> forcing false");
        return false;
    };

});

Script dapat disimpan bernama frida-bypass-root-agoat.js, dengan menggunakan script tsb, maka akan membuat isRooted() dan isRooted1() mengembalikan nilai False.

Kita bisa langsung hook aplikasi dengan spawning script tsb menggunakan Frida, yaitu dengan menjalankan command berikut.

$ frida -U -f owasp.sat.agoat -l frida-bypass-root-agoat.js 
None

Maka pengecekan Root langsung ter bypass dan aplikasi akan menganggap device merupakan not rooted.

None

Akibat dari berhasil nya bypass pengecekan root adalah attacker akan dapat menjalankan aplikasi pada device root dan menjadikan nya super user. Sehingga attacker memiliki kendali penuh atas aplikasi dan akan memudahkan nya dalam melakukan berbagai upaya penyerangan sistem maupun penyalahgunaan data dari aplikasi.

Kerentanan ini dapat dicegah dengan memberikan penjagaan seperti code obfuscation, anti root, anti hooking dan anti tampering, serta dapat juga menggunakan wrapping tools tertentu seperti Guardsquare. Sehingga aplikasi sudah lebih dini prevent berbagai upaya penyerangan dan mempersulit attacker untuk mengambil alih system dalam upaya penyalahgunaan data.

8. Bypass Emulator Detection

Selain pengecekan root, AndroGoat juga memiliki Emulator detection pada EmulatorDetectionActivity. Jika kita cek pada Activity tsb, logic terkait pengecekan Emulator adalah sebagai berikut.

None

Dapat dilihat bahwasanya terdapat logic pengecekan kondisi emulator yaitu dengan mengecek berbagai build properties, kemudian diubah menjadi lowercase. Sejatinya build properties adalah informasi device yang diisi saat build ROM seperti string emulator, unknown, sdk, vbox, atau genymotion, dsb. Jika kondisi nya terpenuhi maka akan bernilai True dan text akan menampilkan "This device is an Emulator", jika sebaliknya akan menampilkan text "This device is not an Emulator".

Setelah memahami logic pengecekan Emulator, maka kita dapat membuat script menggunakan javascript yang akan membalik kan nilai pada method pengecekan tsb untuk kemudian dilakukan bypass Emulator detection menggunakan Frida.

Java.perform(function () {

    var EmulatorDetectionActivity = Java.use("owasp.sat.agoat.EmulatorDetectionActivity");

    EmulatorDetectionActivity.isEmulator.implementation = function () {
        console.log("[+] isEmulator() called -> forcing false");
        return false;
    };

});

Script dapat disimpan bernama frida-bypass-emulator-agoat.js, dengan menggunakan script tsb, maka akan membuat method isEmulator() mengembalikan nilai False.

Kita bisa langsung hook aplikasi dengan spawning script tsb menggunakan Frida, yaitu dengan menjalankan command berikut.

frida -U -f owasp.sat.agoat -l frida-bypass-emulator-agoat.js
None

Maka pengecekan Emulator langsung ter bypass dan aplikasi akan menganggap device merupakan Not an Emulator.

None

Penjagaan deteksi emulator berhasil ter bypass dan sistem/aplikasi jadi dapat dijalankan pada emulator dan akan mempermudah semua upaya pembukaan celah kerentanan aplikasi. Hal tsb memudahkan attacker melakukan upaya penyerangan seperti: Mudah di root dan di debug, dapat snapshot & rollback, dapat instrumentasi runtime (Frida/Xposed), dapat inspect memory, serta Man In The Middle (MITM) traffic dengan lebih mudah.

Kerentanan ini dapat dicegah dengan memberikan penjagaan seperti code obfuscation, anti emulator, anti hooking dan anti tampering, serta dapat juga menggunakan wrapping tools tertentu seperti Guardsquare. Sehingga aplikasi sudah lebih dini prevent berbagai upaya penyerangan dan mempersulit attacker untuk mengambil alih system dalam upaya penyalahgunaan data.

9. Intercept HTTP Request

Client (dalam hal ini aplikasi mobile) berkomunikasi dengan server untuk saling mengirim data melalui jaringan internet menggunakan protocol HTTP atau HTTPS. Request yang dikirim client ke server biasanya berisi: Method, URL endpoint, Header, dan Body Payload, dan server mengirim balik Response yang bakal diterima client berupa: Response Body & header.

Pada aplikasi AndroGoat di TrafficActivity, terdapat fitur yang masih menggunakan protocol HTTP ketika mengirim Request, yang mana hal tsb merupakan sebuah celah kerentanan. Protocol HTTP memiliki celah utama karena data dikirim dalam bentuk plaintext tanpa enkripsi, sehingga siapa pun yang berada di jalur jaringan yang sama dapat mengintip (sniffing), memodifikasi, atau menyisipkan data melalui serangan seperti Man in the Middle (MITM) dan session hijacking. Penyerang juga dapat melakukan request manipulation, misalnya mengubah parameter transaksi, memodifikasi Response server, melakukan replay attack, atau memanfaatkan endpoint internal yang tidak seharusnya diakses oleh pengguna biasa. Karena tidak ada mekanisme untuk menjamin kerahasiaan, integritas, maupun autentikasi server, informasi sensitif seperti kredensial login atau token dapat dengan mudah dicuri.

Proof of Concept Exploit

Kita akan mencoba intercept HTTP Request menggunakan Burp Suite. Burp Suite bekerja dengan memanfaatkan konsep Proxy Server, sehingga dapat membaca dan merekam tiap traffic yang berjalan, hingga memodifikasi Request sebelum dikirim dan Response sebelum diterima.

Sebelum nya, pastikan device atau emulator sudah terpasang sertifikat hasil generate dari Burp Suite, selain itu juga jaringan nya telah menggunakan proxy dengan port dan ip yang disesuaikan. Hal tsb agar traffic yang berjalan pada device atau emulator dapat di tangkap melalui proxy dan ter record pada Burp Suite.

Jika setup sudah siap, jalankan AndroGoat dan triggered fitur yang mengirim request dengan protocol HTTP, dengan klik button HTTP

None

Maka Request terkirim dan ter tangkap pada Burp Suite.

None

Kemudian kita bisa coba intercept sebuah Request pada endpoint tertentu. Misal kita mencoba lakukan login pada endpoint /doLogin include username dan password.

None

Ketika kita forward, maka Request berhasil terkirim dan Response langsung diterima dengan menampilkan Body yang menunjukan halaman main.jsp, beserta session id.

Selain itu percobaan lain kita coba lakukan dengan intercept sebuah Request yang akan menampilkan halaman sebuah akun dengan memasukkan salah satu session id.

None

Ketika kita forward, maka Response akan berhasil keluar beserta code halaman akun sesuai session id yang dikirim.

Celah pada networking yang diupayakan dengan HTTP Intercepting memudahkan penyerang melakukan request manipulation, misalnya mengubah parameter transaksi, memodifikasi response server, melakukan replay attack, atau memanfaatkan endpoint internal yang tidak seharusnya diakses oleh pengguna biasa.

Untuk mengurangi resiko HTTP request intercepting, pastikan seluruh komunikasi menggunakan HTTPS dengan TLS yang kuat dan menolak koneksi HTTP. Selain itu, penerapan certificate pinning penting agar aplikasi hanya mempercayai sertifikat server yang valid sehingga proxy interception tidak dapat dilakukan. Aplikasi juga perlu memiliki integrity dan tamper detection untuk mencegah modifikasi aplikasi atau bypass mekanisme keamanan.

10. Bypass SSL Pinning & Intercept HTTPs Request

Secure Socket Layer (SSL) Pinning adalah teknik yang membantu mencegah serangan MITM (Man in the Middle) dengan menyematkan public key sertifikat SSL/TLS ke dalam aplikasi. Ini berarti ketika aplikasi berkomunikasi dengan server, aplikasi akan membandingkan public key sertifikat SSL/TLS server dengan public key yang disematkan ke dalam aplikasi. Jika cocok, koneksi dianggap aman, bahkan jika sertifikat tersebut ditandatangani oleh CA (Certificate Authority) yang berbeda.

Pada AndroGoat, terdapat SSL Pinning pada TrafficActivity tepat nya sebelum komunikasi HTTPs berjalan.

None

Kode tersebut mengimplementasikan certificate pinning (public key pinning) menggunakan CertificatePinner. Pinning diterapkan pada HTTPS request yang dibuat di method doPinning(). Verifikasi pinning terjadi saat TLS handshake sebelum request HTTP benar-benar dikirim ke server.

Proof of Concept Exploit

Code masih bisa di bypass dengan hooking pada CertificatePinner.check() di runtime, menggunakan script berikut: frida-multiple-unpinning

None

Script tersebut akan bypass berbagai mekanisme SSL pinning di Android dan force semua validasi sertifikat supaya selalu dianggap valid. Hooking dilakukan menggunakan Frida, dengan menjalankan command berikut.

frida -U -f owasp.sat.agoat -l frida-multiple-unpinning.js
None
None

Setelah SSL pinning ter bypass, selanjutnya Request dapat di intercept menggunakan Burp Suite.

None
None

Dikarenakan SSL Pinning dilakukan pada sisi client, sehingga akan banyak kerentanan atas upaya penjagaan yang dipasang. Maka akan menjadi lebih secure jika Aplikasi memiliki integrity dan tamper detection untuk mencegah modifikasi aplikasi atau bypass mekanisme keamanan.

11. Binary Patch for Administrator Role

Pada aplikasi AndroGoat, terdapat sebuah fitur yang hanya dapat diakses oleh user dengan role admin. Namun AndroGoat tidak strict atas keamanan akses role tsb, sehingga terdapat kerentanan yang dapat eksploitasi.

None

Jika kita cek code pada class BinaryPatchingActivity, bahwa validasi admin hanya terjadi pada sebuah variabel bernama isAdmin. Sehingga jika isAdmin mengembalikan nilai True, maka user tsb sudah dianggap admin dan dapat mengakses fitur-fitur eksklusif dari role admin.

Proof of Concept Exploit

Kita bisa bypass pengecekan tsb dengan melakukan repackage / tampering aplikasi. Aplikasi akan kita decompile, mengubah logic validasi admin pada Smali, serta rebuild & resign apk hasil modified tsb. Tools yang akan digunakan adalah ApkTool dan UberApkSigner. Jalankan command berikut pada terminal.

apktool d AndroGoat.apk -o AndroGoat-Decompile
None

Maka aplikasi akan ter ekstrak menjadi sebuah folder AndroGoat-Decompile, dengan isian sbg berikut.

None

kemudian masuk direktori tempat class BinaryPatchingActivity berada.

cd smali_classes2/owasp/sat/agoat

kemudian kita bisa langsung buka dan edit file Smali pada BinaryPatchingActivity.smali

nano BinaryPatchingActivity.smali

Smali pada class tsb akan terbuka dan kita bisa langsung memodifikasi code tsb khusus nya pada validasi admin.

None

Merubah logic Smali dengan membalikkan nilai, pada kasus ini yang diubah adalah if-eqz (aqual zero) menjadi if-nez (not equal zero). Tujuan nya agar jika dalam kondisi !admin atau variable isAdmin false, maka validasi akan terlewat dan tetap mengembalikan nilai True atau dianggap sebagai admin.

Setelah modifikasi selesai, simpan perubahan dan dapat kembali ke direktori awal, kemudian build AndroGoat-Decompile menjadi sebuah apk baru, dengan menjalankan command berikut.

apktool b AndroGoat-Decompile -o AndroGoat-Decompile.apk

Maka akan terbentuk apk baru, dan kita bisa langsung signing apk tsb menggunakan UberApkSigner, dengan menjalankan command berikut.

java -jar uber-apk-signer-1.3.0.jar -a AndroGoat-Decompile.apk --out androgoat-signed

Apk yang sudah tertanda tangani telah terbentuk, dan jika kita buka halaman Binary Pacthing, user sudah memiliki akses sebagai admin.

None

Ketika role admin dapat dimiliki oleh user biasa, maka user dapat secara penuh memiliki akses untuk membaca, menyimpan, hingga memodifikasi data pada aplikasi untuk disalahgunakan dan mengambil keuntungan pribadi atas kepemilikan tsb.

Berbagai cara dapat di lakukan sebagai upaya untuk menghindari celah kerentanan akan akses role admin, antara lain yaitu dengan tidak menyimpan logic otorisasi di sisi client, lakukan validasi role & privilege sepenuhnya di backend, implementasikan signature verification, serta dapat mengaktifkan code obfuscation, app tamper detection & certificate tamper checker.

12. SQL Injection

Pada aplikasi Android, SQL (Structured Query Language) digunakan sebagai bahasa untuk mengelola dan mengakses database lokal, biasanya melalui SQLite. Database ini berfungsi menyimpan data aplikasi seperti user, transaksi, atau konfigurasi, yang kemudian diakses melalui query SQL menggunakan API seperti SQLiteDatabase. Pada proses nya, misal aplikasi akan menerima input dari user (cth: username), lalu menyusunnya menjadi query untuk mencari data yang sesuai di database, kemudian hasilnya ditampilkan ke user melalui UI, misal seperti Toast atau Dialog.

None

Proof of Concept Exploit

Pada kasus di AndroGoat yaitu pada SQLInjectionActivity, terdapat implementasi yang tidak aman karena input dari user langsung digabungkan ke dalam query SQL tanpa validasi atau sanitasi. Query yang digunakan adalah sbg berikut:

SELECT * FROM users WHERE username='[input user]'

Hal ini membuka celah SQL Injection, yaitu dengan menyisipkan payload SQL ke dalam input seperti berikut:

' OR 1=1 --
None

Sehingga query akan berubah menjadi berikut:

SELECT * FROM users WHERE username='' OR 1=1 --'

kondisi OR 1=1 selalu bernilai true, sehingga seluruh data pada tabel users akan dikembalikan tanpa memperhatikan username yang valid, sedangkan tanda - - berfungsi sebagai komentar dalam SQL untuk mengabaikan sisa query di belakangnya. Akibatnya, mekanisme filtering berdasarkan username menjadi tidak efektif dan attacker dapat memperoleh seluruh data user (termasuk password) dari database. Hal ini menunjukkan bahwa aplikasi tidak melakukan sanitasi input maupun penggunaan query yang aman, sehingga rentan terhadap eksploitasi SQL Injection.

Ketika button Verify ditekan, maka qryResult.GetString() akan terpanggil dan setiap data username dan password dari user akan tampil pada Dialog.

None

Kerentanan yang dapat menyebabkan SQL Injection seperti pada case diatas dapat diatasi dengan berbagai cara, antara lain yaitu: Sanitization, Penggunaan SQLiteParameter, Room ORM, dan Parameter binding seperti pada contoh berikut:

Cursor c = db.rawQuery(
    "SELECT * FROM users WHERE username=?",
    new String[]{usernameInput}
);

Dengan binding parameter secara langsung, mustahil mengalami injection.

Berdasarkan hasil dari Android Penetration Testing terhadap aplikasi AndroGoat, ditemukan 12 findings yang mencakup kelemahan pada konfigurasi aplikasi, proteksi sisi client, penyimpanan data, dan mekanisme komunikasi jaringan, serta mekanisme proteksi terhadap reverse engineering dan runtime manipulation. Jika tidak segera diperbaiki, vulnerabilities tersebut berpotensi dimanfaatkan untuk melakukan eskalasi hak akses, pengambilalihan akun, manipulasi data, kebocoran informasi sensitif, hingga kompromi penuh terhadap integritas dan logika bisnis aplikasi.

Implementasi rekomendasi perbaikan yang mencakup secure coding practices, hardening aplikasi, penggunaan certificate pinning yang tepat, proteksi anti tampering yang kuat, serta pengamanan penyimpanan data diharapkan dapat secara signifikan meningkatkan keamanan aplikasi dan menurunkan risiko eksploitasi di production environment.

Terimakasih sudah membaca, semoga bermanfaat 🙏😁

Masih terus belajar, jangan ragu untuk meninggalkan komentar!

Support terus, nantikan tulisan berikut nya yaw 😎