[Bahasa] Tokopedia – Reflected Cross Site Scripting melalui Base64 Encoding

In the name of Allah, the Most Gracious, the Most Merciful.


I. ABSTRACT

Pemberian informasi untuk melakukan aktivasi pada suatu akun yang baru didaftarkan merupakan salah satu fitur yang dapat dilihat oleh para pengguna (dalam konteks membeli) setelah selesai melakukan pendaftaran singkat. Akan tetapi, permasalahan muncul ketika halaman pemberian informasi untuk melakukan aktivasi ini tidak melakukan penyaringan terhadap karakter yang “dapat” dimasukan ke dalamnya. Dalam hal ini, seorang Attacker pun dapat mengganti informasi yang diberikan oleh Tokopedia secara tidak langsung dengan suatu script yang dapat dimanfaatkan untuk skenario serangan lain (seperti me-redirect seorang pengguna ke halaman palsu ataupun men-download suatu malware – akan disebut sebagai Cross Site Scripting di detil penjelasan).

Sekedar informasi, dalam konteks lain hal ini juga dapat dimanfaatkan untuk memberikan informasi palsu kepada pengguna dengan menggunakan kerentanan content Injection (out of scope namun akan tetap disampaikan pada report ini karena sedikit berkaitan).


II. INTRODUCTION

2.1. Reflected Cross Site Scripting (XSS)

Secara sederhana, kerentanan jenis ini merupakan kerentanan yang dapat “membiarkan” seorang Attacker untuk dapat mengeksekusi suatu kode di bagian input yang belum menerapkan penyaringan terhadap special character seperti “ > < : / ; dan sejenisnya. Berbeda dengan Stored XSS yang “menyimpan” suatu kode yang dieksekusi, Reflected XSS justru tidak menyimpan script ini sama sekali sehingga seorang “korban” kembali diharapkan dan diharuskan untuk mengunjungi URL yang “terinjeksi” dengan tambahan konten dari seorang Attacker.


2.2. Content Injection

Content Injection (dalam hal ini adalah teks) merupakan suatu kerentanan yang disebabkan karena belum terdapatnya penyaringan di dalam suatu form ataupun URL di suatu aplikasi berbasiskan web. Secara umum, serangan ini baru dapat bekerja dengan non-aware pengguna yang dijadikan target sebagai korban. Berbeda dengan Reflected XSS yang akan mengeksekusi suatu script secara otomatis ketika pengguna mengunjungi halaman yang telah dimodifikasi (diberi tambahan konten berupa client side scripting seperti Java script), pada Content Injection, justru seorang korban diharuskan melakukan satu langkah manual lagi untuk mewujudkan terciptanya keberhasilan suatu serangan.

Merujuk terhadap suatu statement dari OWASP, serangan tipe ini akan memerlukan tambahan skenario berupa Social Engineering karena pada dasarnya serangan ini memanfaatkan kerentanan pada suatu kode di aplikasi yang disertai dengan memanfaatkan “kepercayaan” pengguna.


2.3. Base64 Encoding

Banyak developer berpikir bahwa Base64 merupakan suatu hal yang dapat digunakan untuk melindungi nilai teks asli yang dikirimkan, diproses, maupun disimpan. Padahal secara kenyataan, Base64 tidak memiliki sifat confidential sama sekali di dalamnya sehingga tidak menjadi standar untuk mengamankan suatu nilai teks asli.


III. SUMMARY OF THE ISSUE

Seperti yang telah disampaikan pada point sebelumnya, permasalahan keamanan pada laporan ini berkaitan dengan kerentanan yang “mengizinkan” seorang Attacker untuk dapat mengeksekusi suatu script (client side scripting) pada salah satu URL yang belum menerapkan penyaringan terhadap suatu special character.

Dalam konteks lain, kerentanan pada URL ini juga dapat dimanfaatkan oleh Attacker untuk memberikan informasi palsu kepada pengguna (Content Injection).


IV. INFORMATION AND SITUATION OF THIS POC

Untuk dapat memahami dengan baik akan permasalahan yang ada, pada bagian ini akan disampaikan mengenai beberapa informasi yang berkaitan dengan proses yang berjalan secara umum dari aplikasi maupun akar dari permasalahan yang ada.

Setelah seorang pengguna dinyatakan terdaftar pada halaman utama registrasi, seorang pengguna akan dihadapkan langsung pada halaman https://accounts.tokopedia.com/activation?email= yang akan disertai dengan informasi akan langkah selanjutnya yang harus dilakukan pengguna untuk dapat login ke aplikasi sebagai member.

Figure 1. Information about Activation Instruction

Seperti yang terlihat dari gambar di atas, aplikasi akan memberikan informasi bahwa petunjuk aktivasi telah dikirimkan ke email yang digunakan untuk mendaftar.

Bila kita melihat lebih jelas, maka akan terdapat value “Y2lyY2xlLmlkdHMyQGhvdG1haWwuY29t” setelah parameter email. Nilai ini sendiri ternyata merupakan suatu base64 sehingga akan dapat dengan mudah di-decode untuk melihat hal yang sebenarnya dikirimkan melalui halaman ini.

Figure 2. Decoded Base64 Value

Dari hasil decode, nilai ini ternyata merupakan nilai email yang telah didaftarkan sebelumnya.


V. STEP TO REPRODUCE

5.1. Persiapkan konten yang ingin diubah menjadi Base64 untuk kemudian disisipkan ke URL yang akan dikirimkan kepada korban. Dalam hal ini, konten dapat berupa window redirection ataupun link untuk mengunduh suatu aplikasi.

5.1.1. Untuk Window Redirection, maka javascript sederhana yang dapat digunakan adalah:

"><script>window.location.href = ('http://www.google.com');</script>

Perlu menjadi catatan bahwa diperlukan “> di depan script yang disisipkan untuk dapat mematikan tag html yang terdapat pada halaman terkait.

Figure 3. Injection Script

Setelah itu, ubah konten yang ada menjadi base64:

Ij48c2NyaXB0PndpbmRvdy5sb2NhdGlvbi5ocmVmID0gKCdodHRwOi8vd3d3Lmdvb2dsZS5jb20nKTs8L3NjcmlwdD4

>> Tanpa tanda kutip dan tanpa sama dengan. Adapun hasil akhirnya yaitu menjadi seperti ini:

https://accounts.tokopedia.com/activation?email=Ij48c2NyaXB0PndpbmRvdy5sb2NhdGlvbi5ocmVmID0gKCdodHRwOi8vd3d3Lmdvb2dsZS5jb20nKTs8L3NjcmlwdD4

5.1.2. Untuk memaksa pengguna mengunduh suatu malware (contoh menggunakan aplikasi 7zip – bukan malware), maka javascript sederhana yang dapat digunakan adalah

"><script>window.location.href = ('http://www.7-zip.org/a/7z1602.exe');</script>

Perlu menjadi informasi kembali bahwa tanda “> kembali diperlukan di depan script yang disisipkan.

https://accounts.tokopedia.com/activation?email=Ij48c2NyaXB0PndpbmRvdy5sb2NhdGlvbi5ocmVmID0gKCdodHRwOi8vd3d3LjctemlwLm9yZy9hLzd6MTYwMi5leGUnKTs8L3NjcmlwdD4
Figure 4. Executed Javascript

5.1.3. Dalam situasi lain, seorang pengguna juga akan dapat dihadapkan pada suatu URL yang telah disisipkan suatu shellcode yang dapat digunakan untuk mengeksploitasi kerentanan pada browser ataupun “lingkungan” browser milik pengguna. Tentunya hal ini akan memerlukan tambahan informasi berupa versi browser yang digunakan oleh pengguna ataupun third party application seperti adobe flash player / jre.

5.2. Langkah kedua, setelah URL yang telah disisipkan dengan script ini telah selesai, maka seorang Attacker hanya perlu mengirimkannya kepada korban yang dituju baik secara langsung maupun tidak langsung.


VI. ADDITIONAL INFORMATION

Untuk dapat memaksimalkan informasi yang disampaikan pada laporan ini, berikut ini terlampir beberapa kondisi tambahan yang perlu diperhatikan:

6.1. Pengujian dilakukan dengan browser Safari, Firefox, dan Chrome versi terbaru. Adapun versi yang digunakan adalah Version 9.1.1 (10601.6.17) untuk Safari, Version 52.0.2743.116 (64-bit) untuk Chrome, dan 48.0 untuk Firefox. Melihat hal ini dan melihat hasil PoC yang telah disampaikan, dapat dinyatakan bahwa mayoritas browser dan versi browser yang dipakai akan dapat mengeksekusi javascript yang disisipkan dengan baik;

6.2. URL hanya berlaku untuk pengunjung atau pengguna yang belum melakukan login ke dalam aplikasi. Dalam hal ini, pengguna yang terlanjur login ke dalam aplikasi tidak akan pernah dapat tereksekusi ke halaman yang dituju oleh Attacker. Hal ini tidak lain dikarenakan aplikasi Tokopedia telah menganggap pengguna yang sudah login tentu tidak akan perlu lagi menuju halaman petunjuk aktivasi;

6.3. Attacker harus memastikan bahwa value yang diubah ke base64 tidak memiliki karakter lain selain huruf dan angka. Dalam hal ini, parameter email yang rentan hanya dapat “menerima” karakter huruf dan angka saja. Bila ternyata ditambahkan karakter lain seperti tanda plus (+), maka aplikasi tidak akan mengeksekusi script yang disisipkan;

6.4. Video Pembuktian (Unlisted Public Video di Youtube): https://youtu.be/h-GJhhTHznk

PoC Video

6.5. Untuk Content Injection, seluruh fake content yang disisipkan akan memiliki warna hijau. (terlampir pada gambar berikut):

Figure 5. Content Injection

VII. RECOMMENDATION

Dalam hal ini, tentunya terdapat beberapa rekomendasi yang dapat dipertimbangkan untuk menutupi kerentanan yang ada:

7.1. Memberikan penyaringan terhadap setiap special character yang di-input-kan di dalam URL yang akan diproses oleh aplikasi.

7.2. Melindungi value dengan enkripsi (bukan dengan encoding) sehingga seorang Attacker tidak akan dapat dengan mudah menebak konten yang ditampilkan oleh aplikasi (dalam hal ini, konten yang disajikan pada value “email”). Dengan menerapkan hal ini, tentu kerentanan Content Injection akan berhasil ditutupi.


VIII. RESPONSE AND TIMELINE OF REPORTING

Tokopedia memberikan respon dan perbaikan yang sangat cepat terkait hal ini. Hanya dalam hitungan jam setelah laporan dikirimkan, kerentanan ini berhasil ditutupi.

  • Aug 10th, 2016 – (malam) mengirim laporan versi 0.1 via email;
  • Aug 11th, 2016 – (pagi hari) mengirim laporan versi 0.2 dengan tambahan informasi;
  • Aug 11th, 2016 – Dalam 3 jam, Tokopedia mengatakan bahwa mereka akan memeriksanya internal;
  • Aug 11th, 2016 – Dalam 2 jam berikutnya, Tokopedia menyatakan bahwa kerentanan telah berhasil ditutupi;
  • Aug 11th, 2016 – Dalam 7 jam, Tokopedia menyatakan akan memberikan award dan menanyakan mengenai identitas personal seperti foto nomor pajak, foto nomor rekening, dan foto ktp;
  • Aug 12th, 2016 – Mengirimkan informasi yang diminta oleh Tokopedia;
  • Aug 13th, 2016 – Tokopedia mengirimkan hadiah.

IX. REFERENCES

9.1. PCI DSS v3.2 (April 2016) point 6.5.7;
9.2. https://www.owasp.org/index.php/Cross-site_Scripting_(XSS);
9.3. https://www.owasp.org/index.php/Testing_for_Reflected_Cross_site_scripting_(OTG-INPVAL-001);
9.4. https://www.owasp.org/index.php/Content_Spoofing


Unduh langsung bentuk .pdf dari tulisan ini pada:

Share

You may also like...