How do I find my first CVE ?

1 day ago 9
BOOK THIS SPACE FOR AD
ARTICLE AD

Ahmad Sopyan

Hallo 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

Gambar 1.0

Vulnerability ini ditemukan pada function rsvp_admin_export()

Gambar 1.1
Gambar 1.2

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 .csv
Gambar 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’
Gambar 1.6 ‘Request After’

5. normal request tanpa payload memakan waktu 3,624 millis sesuai dengan gambar di diatas.

Gambar 1.7 ‘normal time’

6. dari request yang ada payload sleep, server meresponse dengan detik yang ditulis pada payload.

Gambar 1.8 ‘time with payload injection’

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 Parameter

Pastikan nilai $orderby dan $order hanya dapat berisi nilai yang telah ditentukan sebelumnya.

Remediation code :
// Sebelum Whitelisting

Remediation code :
// 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

Read Entire Article