Missing CSRF Token that could Illegally Send a
Message
August 29
th, 2016
@YoKoAcc ([email protected])Missing CSRF Token that could Illegally Sending a Message | page | 2
Revision Detail
Version
Date
Detail
Missing CSRF Token that could Illegally Sending a Message | page | 3
Table of Contents
Revision Detail ... 2 Table of Contents ... 3 Table of Figures ... 3 I. ABSTRACT ... 4 II. INTRODUCTION ... 5III. SUMMARY OF ISSUE ... 5
IV. INFORMATION AND SITUATION OF THIS POC ... 5
V. STEP TO REPRODUCE ... 7
VI. ADDITIONAL INFORMATION ... 8
VII. RECOMMENDATION ... 8
VIII. REFERENCES ... 9
Table of Figures
Figure 1 Fitur Berkirim Pesan pada Tokopedia ... 4Figure 2 Message was Sent Successfully ... 6
Missing CSRF Token that could Illegally Sending a Message | page | 4
I.
ABSTRACT
Berkirim pesan di dalam transaksi jual beli merupakan suatu hal yang lumrah dilakukan baik oleh pembeli maupun penjual. Di dalam realita, pengiriman pesan ini ditujukan dengan banyak kebutuhan baik dengan tujuan bertanya, konfirmasi pembelian / penjualan, ataupun pemberian informasi sensitif seperti nomor rekening untuk proses pembayaran.
Figure 1 Fitur Berkirim Pesan pada Tokopedia
Akan tetapi permasalahan muncul ketika Tokopedia belum memberikan perlindungan berupa unique token pada fitur mengirim pesan ini. Dengan memanfaatkan kerentanan ini, maka seorang Attacker yang berhasil membawa pengguna ke halaman palsu yang dituju akan dapat membuat pengguna dimaksud untuk mengirim pesan secara tidak langsung kepada pengguna yang diharapkan oleh Attacker. Sebagai contohnya yaitu seorang penjual terpecaya diperdaya untuk mengunjungi halaman tertentu dari Attacker sehingga secara tidak langsung dan otomatis mengirimkan pesan palsu (dari Attacker) kepada pembelinya mengenai nilai jual berikut rekening palsu.
Missing CSRF Token that could Illegally Sending a Message | page | 5
II.
INTRODUCTION
Seperti yang pernah dibahas pada paper sebelumnya, secara umum CSRF merupakan suatu serangan yang “memaksa” seorang pengguna untuk melakukan sesuatu yang pada dasarnya “tidak diinginkan” di dalam suatu aplikasi berbasis web dengan memanfaatkan keadaan diri korbannya yang sedang dalam keadaan memiliki otorisasi (login). Umumnya serangan jenis ini dapat dimanfaatkan karena tidak terdapatnya suatu proses autentikasi dalam melakukan suatu perubahan atau tidak terdapatnya token yang unik yang diberikan izin untuk memproses hal dimaksud (token bersifat unik ini biasanya diberikan supaya pengguna tidak lagi dipersulit dengan mengetikan kata sandi untuk perubahan yang tidak terlalu significant).
Di dalam situs Tokopedia, setiap perubahan yang dilakukan oleh pengguna baik itu mengubah profile, menambah daftar rekening, menambah daftar alamat, ataupun menghapus daftar yang ditambahkan selalu disertai dengan token yang di-generate secara otomatis oleh sistem. Perbedaannya, ketika penambahan suatu rekening dan mengubah profile, pengguna diharuskan memasukan kata sandi ataupun mengirimkan OTP terlebih dahulu.
III.
SUMMARY OF ISSUE
Seperti yang telah disampaikan pada point sebelumnya, permasalahan keamanan pada laporan ini berkaitan dengan kerentanan yang “mengizinkan” seorang Attacker untuk dapat “memaksa” korbannya mengirim pesan kepada pengguna lain dikarenakan belum terdapatnya perlindungan berupa unique token.
IV.
INFORMATION AND SITUATION OF THIS POC
Untuk dapat memahami dengan baik akan permasalahan yang ada, pada bagian ini akan disampaikan kembali secara spesifik mengenai beberapa informasi yang berkaitan dengan proses yang berjalan secara umum dari aplikasi maupun akar dari permasalahan yang ada.
Tokopedia memiliki beberapa hal yang di-request menuju server untuk dapat melakukan beberapa hal, yaitu:
4.1. message_subject : Merupakan parameter yang berisikan informasi mengenai judul pesan yang ingin dikirimkan seorang pengguna kepada pengguna lain;
4.2. message : Merupakan parameter yang berisikan informasi mengenai isi pesan yang ingin dikirimkan;
Missing CSRF Token that could Illegally Sending a Message | page | 6
4.3. action : merupakan parameter yang digunakan untuk memerintah aplikasi untuk mengirim pesan baru;
4.4.friend_id: merupakan parameter yang berisikan informasi mengenai nomor ID terdaftar dari pengguna yang dituju.
Adapun contoh request yang dikirimkan terkait proses pengiriman pesan ini yaitu sebagai berikut:
POST /ajax/people-4.pl?aws=1 HTTP/1.1 Host: www.tokopedia.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:48.0) Gecko/20100101 Firefox/48.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Cookie: some of cookies value here
Connection: close
Content-Type: application/x-www-form-urlencoded Content-Length: 124
message_subject=Halooo&message=You+sent+an+illegal+message+to+Dicky&action=event_dia log_new_message&friend_id=11340826&shop=
Table 1 Request for Sending a Message
Dalam konteks ini, Attacker dapat mengganti setiap value yang diberi warna merah untuk keperluan fraud yang ingin dilakukan kepada korbannya. Ketika pengiriman pesan berhasil dilakukan, maka aplikasi akan mengeluarkan respons seperti berikut ini:
Missing CSRF Token that could Illegally Sending a Message | page | 7
V.
STEP TO REPRODUCE
5.1. Persiapkan terlebih dahulu korban yang ingin dituju. Dalam situasi ini, ketika seorang Attacker telah menentukan targetnya, maka Attacker hanya perlu mencari ID dari pengguna dimaksud. Seperti yang telah dijelaskan pada report terkait enumerasi nama pemiliki rekening bank, informasi mengenai nomor ID ini dapat diperoleh Attacker dengan mengunjungi halaman
https://www.tokopedia.com/people/X dengan X merupakan parameter yang dapat digantikan
dengan angka. Setelah berhasil memperoleh nomor ID ini, maka Attacker hanya perlu memasukannya ke dalam parameter “friend_id” pada script yang telah dipersiapkan.
5.2. Langkah berikutnya yaitu Attacker “diharuskan” untuk menentukan subjek pesan dan isi pesan. Sebagai contoh, seorang Attacker ingin membuat Yongki mengirim pesan kepada Dicky, maka .html script sederhana yang perlu dibuat adalah sebagai berikut:
<html> <body>
<form action="https://www.tokopedia.com/ajax/people-4.pl?aws=1"method="POST"> <input type="hidden"name="message_subject"value="Halooo" />
<input type="hidden"name="message"value="You sent an illegal message to Dicky" /> <input type="hidden"name="action"value="event_dialog_new_message" />
<input type="hidden"name="friend_id"value="11340826" /> <input type="hidden"name="shop"value="" />
<input type="submit"value="Submit request" /> </form>
</body> </html>
Table 2 Simple .html Script – Sending a Message from Yongki to Dicky
5.3. Setelah itu, Attacker hanya perlu menunggu korban mengunjungi URL yang telah disiapkan. Ketika korban mengunjungi halaman dimaksud, maka korban pun akan mendapati tampilan berikut ini:
Missing CSRF Token that could Illegally Sending a Message | page | 8
VI.
ADDITIONAL INFORMATION
Untuk dapat memaksimalkan informasi yang disampaikan pada laporan ini, berikut ini terlampir beberapa kondisi tambahan yang perlu diperhatikan:
6.1. .html file yang dipersiapkan seperti pada table 2 dapat “dieksekusi” oleh pengguna mana pun yang sedang dalam keadaan login. Dalam konteks ini, isi pesan akan tetap sama seperti yang telah ditentukan oleh Attacker. Bentuk lain pemanfaatan hal ini yaitu dengan mengirimkan pesan yang berisikan malicious program dari seorang penjual atau pengguna terpercaya;
6.2. Sebagaimana yang juga terjadi dengan kerentanan Reflected XSS yang pernah disampaikan pada laporan sebelumnya, keberhasilan dari serangan ini bergantung dari korban yang terpedaya untuk mengunjungi suatu URL yang di dalamnya telah disisipkan .html file seperti yang telah dijelaskan sebelumnya;
6.3. PoC Video (Unlisted at Youtube): https://youtu.be/-sRfMsRB8nY
VII.
RECOMMENDATION
Dalam hal ini, penambahan parameter token yang bersifat unik di setiap pengiriman action tertentu akan menjadi rekomendasi yang dapat diterapkan untuk menutupi kerentanan yang ada.
Penggunaan CAPTCHA pada dasarnya memang sudah cukup dalam menangani hal ini, namun perlu menjadi catatan bahwa penggunaan CAPTCHA ini sendiri dapat memberikan sedikit dampak tidak menyenangkan kepada para pengguna karena mereka diharuskan bertemu dengan suatu hal yang menyulitkan mereka dalam mengirim pesan. Jadi, penggunaan unique token yang disisipkan dengan action tertentu tentu sudah cukup menutupi kerentanan yang ada.
Penggunaan CAPTCHA baru akan efektif apabila pihak Tokopedia hendak membatasi seorang pengguna dalam mengirim pesan yang banyak dalam satu waktu yang berdekatan. Perlu diingat bahwa fitur CAPTCHA ini merupakan fitur yang pada dasarnya digunakan untuk membedakan antara kegiatan mesin atau kegiatan manusia.
Kesimpulan sederhana:
7.1.Ketika ingin membatasi aktivitas mesin (seperti aktivitas automation scanner ataupun automation request), maka fitur CAPTCHA dapat bermanfaat dengan baik. Akana tetapi, dalam konteks ini, “user friendly” akan menjadi pertimbangan utama;
7.2.Ketika ingin melindungi pengguna dari adanya pengiriman pesan illegal secara otomatis, maka pemberian unique token di setiap action tentu akan bermanfaat dengan baik.
Missing CSRF Token that could Illegally Sending a Message | page | 9
VIII.
REFERENCES
8.1. PCI DSS v3.2 point 6.5.9 (for CSRF);
8.2. https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF);