BOOK THIS SPACE FOR AD
ARTICLE ADHallo CyberExplorer . . . . . .
Pada artikel kali ini, saya ingin berbagi pengalaman ketika saya menemukan kerentanan SQL Injection di plugin WordPress RSVP and Event Management, yang ditetapkan sebagai CVE-2025–24683.
Cacat ini memungkinkan penyerang untuk menyisipkan perintah SQL berbahaya ke dalam kueri basis data, yang dapat dimanfaatkan untuk mencuri data sensitif, memodifikasi informasi dalam basis data, atau bahkan mengambil alih kendali penuh atas server.
Sebagai contoh, jika kerentanan ini dieksploitasi, penyerang dapat mengakses tabel kredensial pengguna atau menghapus data penting pada sistem basis data.
CVSS : 7.6
CWE — 89: Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’)
Kerentanan ini ditemukan di file class-rsvp-helper.php
Vulnerability ini ditemukan pada function rsvp_admin_export()
Kedua variabel pada Gambar 1.1 menjadi argumen dalam fungsi get_attendees() pada Gambar 1.2 yang mengarah pada SQL Injection karena kueri ini tidak menerapkan validasi atau sanitasi yang tepat.
Dalam kasus ini, kerentanan hanya dapat dieksploitasi oleh pengguna dengan peran Administrator untuk fitur RSVP EXPORT.
Untuk membuktikan bahwa kerentanan ini valid, penulis menggunakan fungsi SLEEP untuk mendeteksi bahwa database mengalami penundaan selama N detik
Masuk ke fitur RSVP yang Diekspor pada menu RSVP dan Manajemen Acara.Secara default, fungsi ini akan mendowload file .csvGambar 1.3 ‘Fitur RSVP Exported’Gambar 1.4 ‘Hasil Download’3. Merujuk pada sourcode Gambar 1.2 dan Gambar 1.3, Halaman ini menerima POST Request yang dimana digunakan untuk mengatur susunan data.
4. Ganti http method GET ke POST lalu tambahkan parameter sesuai pada gambar 4 yaitu orderby dan order
Gambar 1.5 ‘Request Before’5. normal request tanpa payload memakan waktu 3,624 millis sesuai dengan gambar di diatas.
6. dari request yang ada payload sleep, server meresponse dengan detik yang ditulis pada payload.
7. dengan payload berikut (SELECT CASE WHEN(1=1) THEN (SELECT SLEEP(10)) ELSE (SELECT SLEEP(0)) END) kita bisa melakukan extract data yang terdapat pada database dengan mengganti logika pada WHEN
Gunakan Whitelist untuk ParameterPastikan nilai $orderby dan $order hanya dapat berisi nilai yang telah ditentukan sebelumnya.
Remediation code :
// Sebelum Whitelisting
// Before Whitelisting
$orderby = 'firstName, lastName';
$order = 'ASC';
if ( isset( $_POST['orderby'] ) && 'attendee' != $_POST['orderby'] && '' != $_POST['orderby'] ) {
$orderby = sanitize_sql_orderby( wp_unslash( $_POST['orderby'] ) );
}
if ( isset( $_POST['order'] ) && '' != $_POST['order'] ) {
$order = sanitize_text_field( wp_unslash( $_POST['order'] ) );
}
$attendees = $this->get_attendees( $orderby, $order );
// After Whitelisting
// Whitelisting untuk $orderby dan $order$allowed_orderby = ['firstName', 'lastName', 'email', 'rsvpStatus'];
$allowed_order = ['ASC', 'DESC'];
$orderby = in_array( $_POST['orderby'], $allowed_orderby, true ) ? $_POST['orderby'] : 'firstName, lastName';
$order = in_array( strtoupper( $_POST['order'] ), $allowed_order, true ) ? strtoupper( $_POST['order'] ) : 'ASC';
$attendees = $this->get_attendees( $orderby, $order );
Penjelasan Remediasi
Parameter $orderby hanya dapat berisi nama kolom yang diizinkan (nama depan, nama belakang, email, rsvpStatus), dan parameter $order hanya dapat berisi ASC atau DESC.Menggunakan fungsi in_array() untuk memastikan nilai parameter $orderby dan $order sesuai dengan daftar yang diizinkan.Hasil patch dari CVE yang saya temukan bisa dilihat pada link commit di bawah ini :
27 Dec 2024 : Reported to Patchstack
24 Jan 2025 : CVE Published by Patchstack