Q
RC OD
E melalui aplikasi seluler untuk memindai lencana peserta pameran proyek keamanan informasi.
Tahun lalu, kami mengunjungi pameran besar proyek keamanan informasi di London. Sebagai persiapan, kami mengirimkan kartu pass kami dalam bentuk PDF βprint it yourselfβ.
Kami segera memperhatikan dua jenis barcode. Menariknya, kode QR terlihat terlalu padat, mengingat cukup untuk menyimpan hanya ID peserta di dalamnya. Karena penasaran, kami meluncurkan pemindai QR dan menerima isi kode:
{"CJe";"BHEEZST","DO";"Cvmmfuqsppg","G";"upn","KU";"Qfofusbujpo uftufs","T";"xzbuu"}
Ternyata hampir-tapi-tidak-cukup-JSON. Salah satu keuntungan dari nama pendek seperti nama saya adalah bahwa itu menarik perhatian Anda dalam situasi seperti itu. Oleh karena itu, saya segera memperhatikan bahwa nama saya dikodekan dalam ROT-25 ("tom" berubah menjadi "upn"). Ia juga dikenal sebagai Caesar's Cipher, di mana setiap huruf diganti dengan yang lain dengan offset tetap (dalam hal ini, huruf dalam alfabet digunakan sebagai ganti setiap huruf). Setelah menjalankan baris melalui decoder (dengan mempertimbangkan markup JSON), kami mendapat:
{"BId";"AGDDYRS","CN";"Bulletproof","F";"tom","JT";"Penetration tester","S";"wyatt"}
Ini lebih mudah dibaca.
Hancurkan?
Anehnya, kode QR menyimpan informasi yang tampaknya terkait dengan bidang BId dalam database. Mengapa Ya, itu sangat sederhana. Panitia telah membuat aplikasi mobile untuk vendor yang membantu mereka mengumpulkan kontak peserta selama pameran. Kami berasumsi bahwa data dienkripsi dalam kode QR jika Wi-Fi atau sinyal seluler tidak stabil.
Sejauh ini, kami dapat melakukan sedikit informasi ini, kecuali mengubah data kami untuk menghindari spam dari vendor dari acara tersebut. Itu akan lucu, tetapi hampir tidak layak untuk mengirim email ke pengembang sistem. Jadi, kami pergi ke Play Market dan menginstal aplikasi yang sesuai untuk melihat fungsinya.
Dan di sini kami menemui masalah: kami tidak memiliki data yang diperlukan dari penyelenggara acara. Kami berpikir bahwa kami dapat memalsukan respons server menggunakan proxy MiTM, dan aplikasi akan melepaskan kami. Kami menyiapkan Burpsuite dan mencatat beberapa upaya masuk yang tidak berhasil, berharap untuk mencegat lalu lintas dan bermain dengannya.
Sayangnya, kami tidak berhasil. Aplikasi mengarahkan semua permintaan menggunakan SOAP, dan tanggapannya tidak jelas. Namun, server menerbitkan dokumen WSDL untuk aplikasi tersebut.
Ini bukan akhirnya
Mengapa tidak menulis layanan web palsu sehingga Anda tidak dapat lagi mengakses server aplikasi sebenarnya? Beberapa jam kemudian kami memiliki layanan seperti itu, dan semua lalu lintas dihidupkan. Itu berhasil! Aplikasi diautentikasi dengan data apa pun dan terhubung ke acara palsu.
Kami memindai beberapa lencana, dan semuanya tampak berfungsi dengan baik. Kemajuan! Setelah berkeliaran di sekitar aplikasi untuk beberapa waktu, menjadi jelas bahwa itu menggunakan semacam kerangka kerja berbasis WebView. Menggali sedikit di APK, kami menemukan sejumlah sebutan Sencha dan Ext.js, yang mengkonfirmasi asumsi kami.
Dan sekarang - yang paling menarik. Jika suatu aplikasi terdiri dari campuran HTML dan JavaScript biasa, dapatkah itu rentan terhadap serangan web standar? Kami membungkus beberapa XSS dalam "tidak-cukup-JSON" yang diharapkan aplikasi, memindai mereka, dan ...
Kami memecahkannya
Hebat! Injeksi HTML di bidang "JT" menunjukkan gambar. Kita dapat menambahkan atribut "onerror" ke tag ini untuk mencapai eksekusi skrip, tetapi kami dibatasi oleh batasan pada panjang maksimum kode QR. Akibatnya, kami membuat payload yang mengunduh file JS dari server dan menjalankannya di perangkat. Di sini, misalnya, adalah tes peringatan standar ():
Memindai kode batang memicu XSS dan mengeksekusi kode:
Kami menyengatnya sehingga pas dengan ukuran maksimum kode QR yang dapat dibaca, tidak terlalu padat untuk mencetak pada kartu pass. Setelah membaca dokumentasi untuk Ext.js API dan membandingkannya dengan kode APK terekompilasi, kami dapat membuat barcode yang:
- Unduh file JS dari server jauh
- Membaca kunci sesi dari smartphone dan mengirimkannya ke server kami
- Membaca isi dari basis data kontak yang di-cache dari aplikasi, termasuk nama dan alamat email semua pass yang dipindai oleh perangkat ini
- Menghapus rekaman Anda dari telepon pintar
Kemudian serangannya muncul sebagai berikut: penjual memindai kode QR saya dengan imbalan pena gratis, dan saya mendapatkan daftar lengkap semua kontak yang dipindai oleh perangkat ini.
Payload:

Permintaan ke server web:

Semua baik-baik saja itu berakhir dengan baik
Kami menarik perhatian para vendor di pameran, dan setelah beberapa diskusi, mereka memutuskan untuk tidak menggunakan aplikasi ini tahun ini. Hanya beberapa orang di acara itu yang memanfaatkan aplikasi ini, sementara kebanyakan pemindai barcode kecil lebih disukai. Aplikasi dari Pasar diunduh hanya sekitar 500 kali. Namun, ini adalah vektor yang menarik untuk XSS, yang menunjukkan bahwa Anda benar-benar perlu memfilter data sebelum digunakan, terlepas dari sumbernya.
Meskipun aplikasi khusus ini belum banyak digunakan, bayangkan jika kerentanannya ada dalam aplikasi yang digunakan oleh ribuan atau diunduh oleh jutaan? Semua data ini untuk penyerang yang akan membuangnya atas kebijakan mereka: dari kampanye phishing hingga serangan brutal.