Kali ini ditemukan kerentanan content injection WordPress yang mempengaruhi REST API. Kerentanan ini memungkinkan penyerang untuk mengubah isi dari posting atau halaman. Tentu, postingan atau halaman yang ada dalam situs berbasis CMS WordPress.
Apakah Kamu Menjadi Salah Satu Yang Terpengaruh Oleh Kerentanan Ini?
Kerentanan content injection WordPress ini sudah diperbaiki dalam versi 4.7.2 bersama dengan perbaikan kecil lainnya. Kerentanan eskalasi hak istimewa ini mempengaruhi WordPress REST API. Yang mana REST API ini baru ditambahkan dan diaktifkan secara default pada versi 4.7.0.
Salah satu titik endpoint REST ini memungkinkan akses melalui API untuk melihat, mengedit, menghapus dan membuat posting. Dalam endpoint tertentu, sedikit bug akan memungkinkan pengunjung untuk mengedit posting pada situs.
REST API diaktifkan secara default pada semua situs yang menggunakan WordPress versi 4.7.0 atau 4.7.1. Jika situs kamu menggunakan WordPress versi tersebut, maka saat ini situs kamu rentan terhadap bug ini.
Rincian Teknis
- Risiko keamanan: Parah
- Eksploitasi Level: Mudah / Remote
- Skor Dread: 9/10
- Kerentanan: Privilege Eskalasi / Content Injection
- Versi Patch: 4.7.2
Dimulai dari ~/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
Ada beberapa hal yang perlu diperhatikan di sini. Rute yang tercatat dirancang untuk mengisi permintaan ID parameter dengan angka. Misalnya, jika kamu mengirim permintaan ke ~/wp-json/wp/v2/posts/1234 – ID parameter nya 1234.
Ini saja bisa menjadi cara yang baik untuk mencegah penyerang dari crafting malicious ID value. Tetapi ketika melihat bagaimana REST API mengelola akses, ternyata hal itu mengutamakan $_GET dan $_POST dari yang dihasilkan regular expression.
Hal itu memungkinkan penyerang untuk mengirim permintaan seperti: ~/wp-json/wp/v2/posts/1234?id=12345helloworld. Yang mana akan menetapkan 12345helloworld ke dalam ID parameter yang nantinya bisa berisi lebih dari sekedar angka.
Ada juga berbagai callback yang bisa kamu lihat pada gambar di atas yang menarik perhatian. Diantaranya yaitu: update_item dan metode izin pemeriksaan update_item_permissions_check.
Singkatnya, melewati alphanumeric ID value langsung ke fungsi get_post(). Fungsi ini memvalidasi permintaan dengan memeriksa jika posting benar-benar ada atau tidak. Dan apakah pengguna memiliki izin untuk mengedit posting ini atau tidak.
Namun, cara tersebut merupakan cara yang aneh mensanitasi permintaan. Jika kita mengirim ID yang tidak memiliki post yang sesuai, kita bisa melewati pemeriksaan izin. Lalu kita diizinkan untuk terus melanjutkan permintaan dengan metode update_item.
Jika ingin tahu penyebab get_post() gagal dalam menemukan posting (selain ID tidak ada), karena disitu menggunakan metode get_instance() static di wp_posts untuk mengambil posting.
Seperti yang kamu lihat dalam codenya, pada dasarnya pada setiap masukan yang tidak terbuat dari karakter numerik akan gagal. Oleh sebab itu, jika seperti 123abc, maka akan gagal.
Bagi penyerang, hal itu berarti bahwa WordPress (berpikir itu adalah pengguna yang cukup memiliki hak istimewa untuk mengedit posting ini) akan menjalankan metode update_item. Dan memang, metode tersebut bisa jadi masuk akal.
Ada jalan yang sangat licik dan begitu penting yang bisa kalian lihat detailnya dalam screenshot terakhir. WordPress cast ID parameter ke integer terlebih dahulu sebelum diteruskan ke get_post.
Tentu saja, itu merupakan masalah. Karena jalan PHP melakukan perbandingan dan konversi. Sebagai contoh, kita dapat melihat bahwa cuplikan berikut akan kembali ke 123:
Hal tersebut bisa menyebabkan situasi yang sangat berbahaya. Dimana seorang penyerang bisa mengirimkan permintaan seperti ~/wp-json/wp/v2/posts/123?id=456ABC untuk mengubah post yang memiliki ID 456.
Karena masalah type-juggling ini, maka memungkinkan bagi penyerang untuk mengubah isi dari posting atau halaman di situs korban. Dari sana, mereka dapat menambahkan shortcode plugin khusus untuk mengeksploitasi kerentanan (yang seharusnya dapat dibatasi untuk peran kontributor). Atau bisa juga menginfeksi konten situs dengan SEO spam, menyuntikkan iklan, d.l.l.
Tergantung pada plugin yang diaktifkan di situs, bahkan kode PHP bisa dijalankan dengan sangat mudah.
Proof of Concept:
https://www.youtube.com/watch?v=dO7krLkWXA0
Kesimpulan
Jika belum mengaktifkan update otomatis pada website berbasis WordPress milik kamu, perbarui secepatnya ya. Ini merupakan kerentanan serius yang dapat disalahgunakan oleh penyerang dengan cara yang berbeda untuk berkompromi dengan situs yang rentan.