addUser
) yang menulis ke SQLite lokal. Aplikasi membentuk INSERT
SQL dengan string concatenation tanpa binding membuka peluang untuk menyisipkan value isPro = 1
lewat field username
. Pada writeup ini saya jelaskan analisis teknis, payload yang berhasil, langkah reproducible, metode verifikasi menggunakan adb exec-out
+ SQLite Viewer, dan bukti hasil eksploitasi.// potongan relevan dari DBHelper.addUser (decompiled)
byte[] bytes = user.getPassword().getBytes(Charsets.UTF_8);
String encodedPassword = Base64.encodeToString(bytes, 0);
String Username = user.getUsername();
byte[] bytes2 = user.getAddress().getBytes(Charsets.UTF_8);
String encodedAddress = Base64.encodeToString(bytes2, 0);
String sql = "INSERT INTO users (username, password, address, isPro) VALUES ('" + Username
+ "', '" + encodedPassword + "', '" + encodedAddress + "', 0)";
db.execSQL(sql);
Masalah utama: Username
dimasukkan tanpa parameter binding -> sumber klasik SQLi.
Payload yang bekerja (paste ke field Username)
van', 'cGFzczEyMw==', 'YWJj', 1); /*
- van — username yang akan dibuat
- cGFzczEyMw== — Base64 dari pass123 (password untuk login)
- YWJj — Base64 dari abc (address dummy)
- 1 — set
isPro = 1
); /*
— menutupVALUES(...)
dan membuka blok komentar sehingga sisa query yang otomatis ditambahkan DBHelper menjadi komentar
Langkah reproduksi
- install APK Food Store.
- Buka Sign Up, paste payload di atas ke Username. Isi Password dan Address sembarang untuk lolos validasi.
- Tekan Sign Up → seharusnya muncul “User Registered Successfully”.
- Login dengan
van
/pass123
→ aplikasi menampilkan Pro User (contoh: Credits: 10000).
Langkah yang saya gunakan untuk bukti database (tanpa scripting tambahan):
- Tarik file DB dari device (jalankan di PC):
adb exec-out run-as com.mobilehackinglab.foodstore cat /data/data/com.mobilehackinglab.foodstore/databases/userdatabase.db > userdatabase.db
- Buka https://sqliteviewer.app/ → upload
userdatabase.db
. - Periksa tabel
users
→ Anda akan melihat record seperti:id | username | password | address | isPro 4 | van | cGFzczEyMw== | YWJj | 1
- Decode Base64 untuk password:
cGFzczEyMw==
→ pass123.
Kasus Food Store menegaskan: pola coding sederhana (string concatenation -> execSQL) dapat berujung pada eskalasi hak akses lokal. Perbaikan pada level kode mudah namun konsekuensi bisnis jika terjadi pada produk nyata sangat besar.