Celah Keamanan Pada Website JAMSOSTEK


  • SPYRO KiD
  • admin[~@t~]spyrozone[~d.t~]net
  • Tuesday, December 28th, 2010
  • CopyLEFT (c) 2011++ www.spyrozone.net All Rights Reserved


Situs resmi JAMSOSTEK (www.jamsostek.co.id) merupakan satu dari sederetan situs perusahaan di Indonesia yang memliki celah keamanan berupa kebocoran file SQL. Saya mulai melirik celah ini sekitar 3 bulan yang lalu, tapi baru sekarang sempat menuliskan laporan untuk Admin ^^”

Karena celah keamanan ini sudah lama ada, dugaan sementara saya pastinya banyak tertanam (setidaknya, ada) backdoor pada website tersebut. Didorong rasa penasaran, saya mencoba mencari tau jalan termudah Attacker untuk masuk ke sistem mereka dan menanam backdoor :D

Bocornya File SQL

Celah ini memang bisa ditemukan dan dilihat oleh siapapun karena Google sudah terlanjur merambahnya. Saya menggunakan jasa Google dengan memasukan keyword:

filetype:sql site:jamsostek.co.id

Kata kunci tersebut menghasilkan 2 hasil pencarian berupa file SQL.

{image: Kebocoran file SQL}

Kebocoran file SQL

File pertama, http://www.jamsostek.co.id/jmsportal_2122005.sql, menyimpan informasi sensitif berikut:

-- phpMyAdmin SQL Dump
-- version 2.6.2-pl1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Dec 21, 2005 at 10:56 AM
-- Server version: 4.1.11
-- PHP Version: 5.0.4
--
-- Database: `jamcms`
--
-- --------------------------------------------------------
--
-- Table structure for table `advertisement`
--
.....
............
.................
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
 `userid` varchar(20) NOT NULL default '',
 `password` varchar(20) default NULL,
 `name` varchar(50) default NULL,
 `email` varchar(60) default NULL,
 `phone` varchar(20) default NULL,
 `added_by` varchar(20) default NULL,
 `added_date` datetime default NULL,
 `level` varchar(30) default NULL,
 `modul` varchar(20) default NULL,
 PRIMARY KEY  (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Dumping data for table `users`
--
INSERT INTO `users` VALUES ('admin', 'admin', 'Administrator', 'jrobalian@yahoo.com', '234234', NULL, NULL, 'Superuser', NULL);
INSERT INTO `users` VALUES ('lutung', 'lutung', 'Lutung Melalung', 'belikade@yahoo.com', '234234', NULL, NULL, 'Administrator', NULL);
....

Yap, kita mendapat informasi berharga:

Username Password
admin admin
lutung lutung

Saya mencoba login dengan akun-akun tersebut melalui halaman login Administrator Jamsostek (http://www.jamsostek.co.id/admin/). Kabar buruk, akses menuju halaman admin dengan kedua akun diatas DITOLAK :( Kabar baiknya.. tidak ada mekanisme untuk mencegah brute force :D

{image: Akses ditolak}

Akses ditolak

Wajar sich jika informasi pada file SQL tersebut sudah tidak valid,  filenya sendiri digenerate 5 tahun yang lalu, 21 Desember 2005.  Saya segera beralih ke file berikutnya ^^

File kedua, http://www.jamsostek.co.id/backup-data/jams.sql, memiliki ukuran 24.48MB. Dari informasi yang digenerate phpMyAdmin, file ini dibuat pada 2 Februari 2010. Saya mencari tabel password dan menemukan sesuatu yang sedikit berbeda dari file pertama.

Yap, kali ini passwordnya sudah dienkripsi dengan mcrypt :D Berikut adalah daftar user selengkapnya:

Name Username Encrypted Password Level
Jamsostek Administrator admin 65393736333865633832 Administrator
Gauss webadmin 38383331623463336332 Administrator
Dhwi Jayanthy dhwi 64386433613031626137 Administrator
ilyas ilyas 33656134613865346437 Administrator
Ebenezer Simanjuntak eben 65396532333166613764 User Normal
ari ari 66633239326264376466 User Normal
uus supriyadi uus 61366538633236666461 User Normal
ery arianto ery bisap 38666562666233316535 Guest
puspitaningsih puspitaningsih dap 61653465303862323037 Guest
zain setyadi zain 33656439623935653462 Guest
jro jro 34663463343939616266 Guest
I Kade Budiarta kadek 39626430613033346261 Guest
eko semino eko sdm 65356561396236643731 Guest
pulung riyanto pulung manris 34373938306661323164 Guest
neneng salamah neneng dil 34666134636239376534 Guest
weny herdiani weny akuntansi 36626530316433363264 Guest
ibnu rusdan ibnu pupm 31393561636538643530 Guest
isnavodiar jatmiko iko renbang 34616334643336363963 Guest
nelson hasudungan nelson renbang 61346533363036383136 Guest
dian senoaji dian keu 66393764653461393938 Guest
endang sri hastuti endang pkp 37353635613166623166 Guest
eris aprianto eris operasi 34346137653036343836 Guest
gunara setiady gunara akuntansi 63343638303064363566 Guest
ira listyosari ira pengadaan 33633637303830613161 Guest
Gaus Gaus gaus 63613366623038616432 Guest

Hmm.. gimana yach cara decryptnya? hehehe.. daripada mengabiskan waktu mencari cara untuk mendekrip passwordnya, saya menggunakan jurus ampuh: mencari user yang passwordnya sama dengan usernamenya :p

User: admin, Password: admin -> gagal :’(
User: webadmin, Password: webadmin -> gagal :’(

….
User: uus, Password: uus -> berhasil, bisa login setingkat “User Normal” :D

User: zain, Password: zain -> berhasil, bisa login setingkat “Guest” ^_*

Upload Webshell

Langsung ajah saya login sebagai “uus” dengan User: uus, Password: uus :D   berikut adalah menu-menu yang bisa saya Akses dengan user tersebut:

{Image: Menu yang bisa diakses "User Normal"}

Menu yang bisa diakses "User Normal"

Menu paling menarik bagi saya adalah menu Downloads. Dimana ada Downloads, tentunya ada fasilitas Upload :D Dan dugaan saya ternyata…

{image: Fasilitas Upload}

Fasilitas Upload

Yeah, saya menemui fasilitas Upload. Saya berhasil melakukan upload webshell melalui fasilitas tersebut.Tapi… dimana ya letak file-file yang sudah diupload? Saya menuju halaman Unduh situs Jamsostek.co.id

{images: Halaman Unduh situs Jamsostek}

Halaman Unduh situs Jamsostek

Wah, nama saya nampang disana :D Setelah saya klik icon Folder di kolom paling kanan, Webshell saya muncul dengan sempurna ;)

{image: Webshell}

Webshell

Sampai disini, kita bisa melihat 2 kelalaian lagi:

  1. Tidak ada filter pada fasilitas tersebut. User bisa melakukan upload file apapun, termasuk PHP;
  2. Folder upload tidak diproteksi sehingga script PHP saya dieksekusi;
  3. Fungsi-fungsi berbahaya pada PHP tidak didisable sehingga saya bisa memanfaatkan webshell untuk menjalankan perintah-perintah shell;

Dengan memanfaatkan webshell, kini attacker bisa melakukan apapun yang diinginkan.. melihat username dan password database, melihat isi database terbaru, mencuri account-account perusahaan yang mendaftarkan diri pada Jamsostek, atau menggunakan tar untuk mendownload CMS Jamsostek :D

Insuficient Authorization

Saya jadi penasaran nich, apa yang terjadi jika saya login dengan account setingkat Guest ‘_’? Arh.. daripada penasaran, saya coba login dengan user setingkat Guest yang saya dapat tadi, User: zain, Password: zain

{image: Hak akses akun setingkat Guest}

Hak akses akun setingkat Guest

Yaah.. bener-bener nggak seru nich. Menu yang diberikan untuk Guest sangat terbatas. Saya akan berpura-pura sebagai Guest yang belum pernah login sebagai user dengan level yang setingkat diatasnya :D Hmm.. kira-kira dengan segala keterbatasan ini, bisa nggak ya Guest melakukan kecurangan untuk mendapatkan akses yang lebih tinggi? Bisa nggak yach Guest mengakses fasilitas Download untuk melakukan Upload webshell?

Saya mulai melirik URL dan menemui ada sesuatu yang menarik disana >:)

main.php?mainid=4

mainid=4 .. kenapa harus “4″? bagaimana kalau “1″ :D Iseng-iseng, saya ubah urlnya menjadi mainid=1 (http://www.jamsostek.co.id/admin/main.php?mainid=4) :D Dan ternyata..

{image: Menu yang disembunyikan tidak dilindungi session}

Menu yang disembunyikan tidak dilindungi session

Wah, saya mendapati halaman yang seharusnya tidak boleh diakses oleh user setingkat Guest. Fasilitas-fasilitas terlarang bagi Guest ini seharusnya tidak hanya disembunyikan, tapi juga dilindungi dengan menggunakan session. Hm.. sampai disini, ternyata saya masih belum mendapatkan hak akses untuk upload.

Saya mencoba mengakses:

main.php?mainid=2
main.php?mainid=3

Harapan saya sich ada area tersembunyi lagi ^^” tapi ternyata saya hanya menemui halaman kosong. Dimana saya harus mencari nilai mainid yang benar? Aha..! (saya bukan sedang promosi Modem lho :D ) saya akan mencoba mencarinya di database  Jamsostek yang saya temukan melalui Googling tadi :D

{image: Search mainid pada database}

Search mainid pada database

Yeah, ketemu nich.. admin/main.php?mainid=101 Saya segera melompat ke (http://www.jamsostek.co.id/admin/main.php?mainid=101)

{image: Guest bisa mengakses area User Normal}

Guest bisa mengakses area User Normal

Dan saya mendapati menu-menu lain yang sebelumnya disembunyikan bagi Guest, kini bisa diakses, termasuk menu Download. Sampai disini, Guest bisa memanfaatkan fasilitas Upload untuk mengupload Webshell d’_'b

Penutup

Celah keamanan beserta solusi atas kelemahan-kelemahan ini telah saya laporkan kepada Admin Jamsostek. Setidaknya kita bisa mendapatkan pelajaran berharga:

  1. Gunakan password yang secure. Banyak user dengan hak akses rendah yang tidak peduli dengan passwordnya. “Arrh.. biarin ajah password saya dicuri, toh cuma level biasa. Kalau password saya diubah, saya tinggal tanya ke Admin.” —> pemikiran ini sering saya temui. Di tangan Attacker yang tepat, segala keterbatasan hak akses bisa dilewati untuk menuju kepada level yang lebih tinggi.
  2. Dalam membangun CMS multi user dan multi level, pastikan setiap area terlindungi dengan session untuk mengatur hak akses, bukan hanya dilindungi dengan menyembunyikan menu.
  3. Sanitasi modul upload, izinkan user hanya mengupload file-file yang diperlukan saja (ex: jpg,gif,pdf)
  4. Disable php pada directory upload. Buatlah file .htaccess pada setiap directory upload dengan konten sebagai berikut:
    <IfModule mod_php.c>
    php_flag engine off
    </IfModule>
    AddType text/plain .html .htm .shtml .php .php3 .php5 .phtml .phtm .pl .py .cgi
  5. Disable fungsi berbahaya yang tidak diperlukan. Misalnya: system, exec, shell_exec, passthru, error_log, ini_alter, dl, pfsockopen, openlog, syslog, readlink, symlink, link, leak, popen, escapeshellcmd, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, escapeshellarg, pcntl_exec
    set display_errors off

    Tentunya hal ini menyesuakan fungsi-fungsi yang diperlukan cms Anda.
  6. Untuk menyulitkan Malicious Outsider, sembunyikan halaman Admin, jangan menggunakan /admin atau /administrator. Sudah banyak ditemui kasus adanya kebocoran file sql namun attacker gagal masuk karena tidak mengetahui url untuk login menuju halaman Admin.

Sekian, semoga bisa menambah pengetahuan dan kewaspadaan Anda ;)


//E.O.F