Internet Home Page Bringing True Journalism Without Fake News Bug CSRF di WordPress 5.1 untuk melakukan Remote Code Execution

Bug CSRF di WordPress 5.1 untuk melakukan Remote Code Execution

by Hairiman

Posting blog ini mengungkapkan rantai eksploit kritis lain untuk WordPress 5.1 yang memungkinkan penyerang tidak terauthentikasi untuk mendapatkan eksekusi kode jarak jauh pada setiap instalasi WordPress sebelum versi 5.1.1 .

Dampak

Penyerang dapat mengambil alih situs WordPress mana pun yang memiliki komentar diaktifkan dengan menipu administrator blog target untuk mengunjungi situs web yang dibuat oleh penyerang. Segera setelah administrator korban mengunjungi situs web jahat, eksploitasi pemalsuan lintas situs (CSRF) dijalankan terhadap target blog WordPress di latar belakang, tanpa memperhatikan korban. Eksploitasi CSRF menyalahgunakan banyak kesalahan logika dan kesalahan sanitasi yang bila digabungkan mengarah pada Eksekusi Kode Jarak Jauh dan pengambilalihan situs secara penuh.

Kerentanan ada di versi WordPress sebelum 5.1.1 dan dapat dieksploitasi dengan pengaturan default.

WordPress digunakan oleh lebih dari 33% dari semua situs web di internet, menurut halaman unduhannya sendiri. Mempertimbangkan bahwa komentar adalah fitur inti dari blog dan diaktifkan secara default, kerentanan mempengaruhi jutaan situs.

Analisis Teknis

CSRF dalam bentuk komentar mengarah ke injeksi HTML

WordPress tidak melakukan validasi CSRF ketika pengguna memposting komentar baru. Ini karena beberapa fitur WordPress seperti trackback dan pingback akan rusak jika ada validasi. Ini berarti penyerang dapat membuat komentar atas nama pengguna administratif dari blog WordPress melalui serangan CSRF.

Ini dapat menjadi masalah keamanan karena administrator blog WordPress diizinkan menggunakan tag HTML sewenang-wenang dalam komentar, bahkan <script>tag. Secara teori, penyerang bisa saja menyalahgunakan kerentanan CSRF untuk membuat komentar yang mengandung kode JavaScript berbahaya.

WordPress mencoba untuk menyelesaikan masalah ini dengan membuat nonce ekstra untuk administrator dalam bentuk komentar. Ketika administrator mengirimkan komentar dan memberikan nilai yang valid, komentar tersebut dibuat tanpa sanitasi. Jika notce tidak valid, komentar masih dibuat tetapi disanitasi.

Cuplikan kode berikut menunjukkan bagaimana ini ditangani di inti WordPress:

/wp-includes/comment.php (Kode Sederhana)

323932403241324232433244324532463247⋮ if ( current_user_can( 'unfiltered_html' ) ) { if (! wp_verify_nonce( $_POST['_wp_unfiltered_html_comment'], 'unfiltered-html-comment' )) { $_POST['comment'] = wp_filter_post_kses($_POST['comment']); } } else { $_POST['comment'] = wp_filter_kses($_POST['comment']); } ⋮

Fakta bahwa tidak ada perlindungan CSRF yang diterapkan untuk formulir komentar telah diketahui sejak 2009 1 .

Namun, kami menemukan kesalahan logika dalam proses sanitasi untuk administrator. Seperti yang dapat Anda lihat dalam cuplikan kode di atas, komentar selalu dibersihkan dengan wp_filter_kses(), kecuali jika pengguna membuat komentar adalah administrator dengan unfiltered_htmlkemampuan. Jika itu yang terjadi dan tidak ada ketidaksesuaian yang diberikan, komentarnya akan dibersihkan dengan wp_filter_post_kses()(baris 3242 dari potongan kode di atas).

Perbedaan antara wp_filter_post_kses()dan wp_filter_kses()terletak pada keketatannya. Kedua fungsi menerima komentar yang tidak bersih dan hanya menyisakan daftar tag dan atribut HTML yang dipilih dalam string. Biasanya, komentar dibersihkan dengan wp_filter_kses()yang hanya memungkinkan tag dan atribut HTML yang sangat mendasar, seperti <a>tag dalam kombinasi dengan hrefatribut.

Hal ini memungkinkan penyerang untuk membuat komentar yang dapat berisi lebih banyak tag dan atribut HTML daripada komentar yang biasanya diizinkan untuk berisi. Namun, meskipun wp_filter_post_kses()jauh lebih permisif, masih menghilangkan tag HTML dan atribut yang dapat menyebabkan kerentanan Cross-Site-Scripting.

Menambah injeksi HTML tambahan ke XSS yang Disimpan

Fakta bahwa kita dapat menyuntikkan tag dan atribut HTML tambahan masih mengarah pada kerentanan XSS yang tersimpan di inti WordPress. Ini karena beberapa atribut yang biasanya tidak dapat diatur dalam komentar diuraikan dan dimanipulasi dengan cara yang salah yang mengarah pada injeksi atribut yang berubah-ubah.

Setelah WordPress selesai membersihkan komentar itu akan memodifikasi <a>tag dalam string komentar untuk mengoptimalkannya untuk keperluan SEO.

Ini dilakukan dengan mem-parsing string atribut (misalnya href="#" title="some link" rel="nofollow") dari <a>tag ke dalam array asosiatif (baris 3004 dari cuplikan berikut), di mana kuncinya adalah nama atribut dan nilai nilai atribut.

wp-include / formatting.php

3002300330043005function wp_rel_nofollow_callback( $matches ) { $text = $matches[1]; $atts = shortcode_parse_atts($matches[1]); ⋮

WordPress kemudian memeriksa apakah relatributnya disetel. Atribut ini hanya dapat ditetapkan jika komentar disaring melalui wp_filter_post_kses(). Jika ya, ia akan memproses relatribut dan kemudian <a>menyatukan kembali tag.

wp-include / formatting.php

3013301430153016301730183019302030213022 if (!empty($atts['rel'])) { // the processing of the 'rel' attribute happens here ⋮ $text = ''; foreach ($atts as $name => $value) { $text .= $name . '="' . $value . '" '; } } return '<a ' . $text . ' rel="' . $rel . '">'; }

Cacat terjadi pada baris 3017 dan 3018 dari cuplikan di atas, di mana nilai atribut disatukan kembali bersama-sama tanpa melarikan diri.

Penyerang dapat membuat komentar yang berisi <a>tag buatan dan mengatur misalnya titleatribut jangkar title='XSS " onmouseover=alert(1) id="'. Atribut ini adalah HTML yang valid dan akan melewati langkah sanitasi. Namun, ini hanya berfungsi karena titletag yang dibuat menggunakan tanda kutip tunggal.

Ketika atribut disatukan kembali, nilai titleatribut dibungkus dalam tanda kutip ganda (baris 3018). Ini berarti penyerang dapat menyuntikkan atribut HTML tambahan dengan menyuntikkan kutipan ganda tambahan yang menutup titleatribut.

Misalnya: <a title='XSS " onmouseover=evilCode() id=" '>akan berubah menjadi 
<a title="XSS " onmouseover=evilCode() id=" ">setelah diproses.

Karena komentar sudah disanitasi pada saat ini, onmouseoverevent handler yang diinjeksi disimpan dalam database dan tidak dihapus. Ini memungkinkan penyerang untuk menyuntikkan muatan XSS yang tersimpan ke situs web target dengan merantai cacat sanitasi ini dengan kerentanan CSRF.

Menjalankan XSS secara langsung melalui iframe

Langkah selanjutnya bagi penyerang untuk mendapatkan Eksekusi Kode Jarak Jauh setelah membuat komentar jahat adalah untuk mendapatkan JavaScript yang disuntikkan dieksekusi oleh administrator. Komentar tersebut ditampilkan di frontend blog WordPress yang ditargetkan. Frontend tidak dilindungi oleh X-Frame-Optionstajuk oleh WordPress itu sendiri. Ini berarti komentar dapat ditampilkan secara tersembunyi <iframe>di situs web penyerang. Karena atribut yang disuntikkan adalah onmouseoverevent handler, penyerang dapat membuat iframe mengikuti mouse korban untuk secara instan memicu muatan XSS.

Ini memungkinkan penyerang untuk mengeksekusi kode JavaScript sewenang-wenang dengan sesi administrator yang memicu kerentanan CSRF di situs web target. Semua eksekusi JavaScript terjadi di latar belakang tanpa diperhatikan oleh administrator korban.

Menambah eksekusi JavaScript ke Remote Code Execution

Sekarang dimungkinkan untuk mengeksekusi kode JavaScript sewenang-wenang dengan sesi administrator, Eksekusi Kode Jarak Jauh dapat dicapai dengan mudah. Secara default, WordPress memungkinkan administrator blog untuk secara langsung mengedit .phpfile tema dan plugin dari dalam dashboard admin. Dengan hanya memasukkan backdoor PHP, penyerang dapat memperoleh eksekusi kode PHP sewenang-wenang di server jauh.

Tambalan

Secara default, WordPress secara otomatis menginstal pembaruan keamanan dan Anda seharusnya sudah menjalankan versi terbaru 5.1.1. Jika Anda atau hoster Anda menonaktifkan fungsi pembaruan otomatis karena beberapa alasan, Anda juga dapat menonaktifkan komentar hingga tambalan keamanan diinstal. Yang paling penting, pastikan untuk keluar dari sesi administrator Anda sebelum mengunjungi situs web lain.

You may also like

Leave a Comment