Apa yang penulis tulis disini adalah untuk edukasi dan sharing pengalaman semata, hal-hal yang tidak diinginkan yang terjadi akibat membaca artikel ini adalah diluar tanggung jawab penulis.
Pembukaan
Beberapa pekan lalu saya mencoba melakukan penetration testing pada salah satu website milik teman saya. Pada saat melakukan kegiatan ini saya mendapati celah yang sangat critical pada package Voyager.
Voyager
Voyager adalah Laravel admin package yang menyediakan fitur BREAD(CRUD), manajemen media, menu builder, dan banyak lainnya. Kalian bisa baca-baca langsung di website mereka (https://voyager.devdojo.com).
Step to Reproduce
Seperti biasa, kegiatan pentest rasanya kurang afdhol kalau tidak melakukan enumeration terhadap target. Disini saya menggunakan Nmap, Dirsearch, dan Sublist3r. Terdapat hal menarik ketika saya melakukan scanning terhadap target terutama saat menggunakan Dirsearch, banyak direktori yang seharusnya diproteksi namun luput dari perhatian mereka.
Mata saya langsung tertuju ke direktori admin, ketika saya buka dapatlah informasi kalau website ini menggunakan voyager sebagai CMS nya.
Saya pun langsung teringat sebuah bug yang terdapat di package ini, yaitu sebuah Directory Traversal yang memungkinkan attacker dapat membaca file diluar root website. Bug tersebut terdapat pada Voyager versi 1.3.0 kebawah. Vulnerable codenya terdapat pada:
voyager/src/Http/Controllers/VoyagerController.php
public function assets(Request $request)
{
*$path = str_start(str_replace(['../', './'], '',
urldecode($request->path)), '/');*
* $path = base_path('vendor/tcg/voyager/publishable/assets'.$path);*
if (File::exists($path)) {
$mime = '';
if (ends_with($path, '.js')) {
$mime = 'text/javascript';
} elseif (ends_with($path, '.css')) {
$mime = 'text/css';
} else {
$mime = File::mimeType($path);
}
$response = response(File::get($path), 200,
['Content-Type' => $mime]);
$response->setSharedMaxAge(31536000);
$response->setMaxAge(31536000);
$response->setExpires(new \DateTime('+1 year'));
return $response;
}
return response('', 404);
}
Gapake lama, saya langsung mencoba eksekusi bug ini dengan mencoba membaca file /etc/passwd lewat parameter /voyager-assets?path=
dan BOOM!
Tidak berhenti sampai disini, saya pun berniat membaca file .env, tetapi sebelumnya kita harus tau root directory dari web tersebut. Kembali membuka hasill scanning Dirsearch mata saya tertuju pada direktori logs. Ketika saya membuka direktori tersebut saya pun mendapati apa yang saya cari, yaitu root directory dari web tersebut.
Lalu saya mencoba membaca file .env nya dengan payload {rootdirectory}/.env
jengjengjeng...
Server pun merespon dengan membawa file .env kepada attacker. Dari sini attacker bisa melanjutkan aksinya dengan memanfaatkan data-data critical yang didapat kan.
Remediation
- Pastikan untuk membatasi akses terhadap direktori yang sifatnya sensitif.
- Pastikan untuk selalu mengupdate versi tech stack yang digunakan.