Sekitar
akhir Mei 2010 lalu, saya mendapati banyak halaman website Pemerintah
Kabupaten Sidoarjo (www.sidoarjokab.go.id) yang menampilkan pesan
deface. Celahnya sendiri sudah ada sejak awal 2007. Saat itu
sidoarjokab.go.id menggunakan jasa Solusindo Hosting sebelum beralih ke
PT. Data Utama Dinamika.
Salah satu celah pada website ini sudah banyak dibicarakan di forum-forum underground (meski “hanya” sekedar info untuk melihat /etc/passwd) sejak awal tahun 2009. Yang membuat saya lebih prihatin, belum ada tindakan dari Administrator untuk melakukan perbaikan.
Saya
kemudian memulai explorasi mencari jalan termudah bagi Attacker untuk
masuk, celah-celah apa saja yang ada pada website tersebut, lalu
melaporkannya kepada Admin dengan meninggalkan solusi pada file yang
vulnerable di server Pemerintah Kabupaten Sidoarjo. Beberapa solusi yang
saya sarankan telah diimplementasikan walaupun belum menyeluruh.
Berikut catatan perjalanan saya dalam mencari celah pada website
Pemerintah Kabupaten Sidoarjo yang dimanfaatkan oleh Attacker untuk
melakukan pengrusakan dan menanam backdoor. Selamat menikmati

DEFACED by…
Semua pesan deface yang saya jumpai
meninggalkan nama dan alamat website yang sama. Berikut ini adalah salah
satu tampilan halaman website Pemerintah Kabupaten Sidoarjo yang diubah
tampilannya oleh Attacker:

Pesan deface pada website Pemkab. Sidoarjo yang ditinggalkan Attacker
Ada total 74 halaman yang diubah tampilannya oleh Jester:
- http://www.sidoarjokab.go.id/domain/perpus/daftar_buku/buku_2006/index.php
- http://www.sidoarjokab.go.id/ekonom/sembako/index.php
- http://www.sidoarjokab.go.id/interaktif/agenda/index.php
- http://www.sidoarjokab.go.id/interaktif/guestbook/harian/index.php
- http://www.sidoarjokab.go.id/interaktif/guestbook/harian/index2.php
- http://www.sidoarjokab.go.id/interaktif/guestbook/harian/indexi.php
- http://www.sidoarjokab.go.id/interaktif/guestbook/index.php
- http://www.sidoarjokab.go.id/interaktif/new/index.htm
- http://www.sidoarjokab.go.id/interaktif/new/index.php
- http://www.sidoarjokab.go.id/interaktif/new/index-news.php
- http://www.sidoarjokab.go.id/interaktif/poling/index.php
- http://www.sidoarjokab.go.id/other/baz/main.php
- http://www.sidoarjokab.go.id/other/baz/main-bgBAZ2008.html
- http://www.sidoarjokab.go.id/other/BlockGrand/default-menus.htm
- http://www.sidoarjokab.go.id/other/BlockGrand/index-main.htm
- http://www.sidoarjokab.go.id/other/dekranas/guest/index.php
- http://www.sidoarjokab.go.id/other/warintek/index-.php
- http://www.sidoarjokab.go.id/sub/bagianap/indexing.htm
- http://www.sidoarjokab.go.id/sub/bkd/Berita/index.php
- http://www.sidoarjokab.go.id/sub/bkd/Berita/index_asli.php
- http://www.sidoarjokab.go.id/sub/bkd/Berita/index2.php
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/index.htm
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_access_denied.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_footer.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_footer2.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_forumgroup.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_forums.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_forums_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_forums_list.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_header.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_last_discuss_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_last_discussions.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_post_area.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_post_closed.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_post_form.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_posthold.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_posts.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_posts_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_topics.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_topics_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_topics_write.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_user_info.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_user_info_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/Berita/templates/main_warning.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/index2.php
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_access_denied.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_footer.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_footer2.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_forumgroup.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_forums.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_forums_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_forums_list.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_header.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_last_discuss_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_last_discussions.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_post_area.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_post_closed.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_post_form.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_posthold.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_posts.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_posts_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_topics.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_topics_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_user_info.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_user_info_cell.html
- http://www.sidoarjokab.go.id/sub/bkd/forum/templates/main_warning.html
- http://www.sidoarjokab.go.id/sub/candi/default.htm
- http://www.sidoarjokab.go.id/sub/gedangan/default.htm
- http://www.sidoarjokab.go.id/sub/index.php
- http://www.sidoarjokab.go.id/sub/krian/index.html
- http://www.sidoarjokab.go.id/sub/main.php
- http://www.sidoarjokab.go.id/sub/prambon/default.htm
- http://www.sidoarjokab.go.id/sub/rsd/index.php
- http://www.sidoarjokab.go.id/sub/tulangan/default.htm
Hingga kini halaman tersebut belum
dibenahi oleh Admin. Mengenai defacernya sendiri, banyak yang menyebut
si Jester & Ghost61 ini berasal dari Turki (http://www.google.co.id/search?q=Ghost61+Jester).
Bagaimana cara mereka masuk? dimana
letak celah keamanannya? tidak usah tanya si Jester, Ghost 61, apalagi
tanya Galileo, cukup lanjutkan membaca artikel ini

HTML Injection
Celah pertama yang saya bahas ini pasti
sudah sering Anda temui. Target exploitasi celah ini adalah layanan Buku
Tamu sidoarjokab.go.id. Saya memasukkan code HTML berupa tag <h1>
pada form Buku Tamu:

Injeksi code HTML pada Buku Tamu
Hasilnya, input saya tidak disanitasi sehingga identitas dan komentar saya tampil dalam ukuran heading 1:

Hasil Injeksi code HTML pada Buku Tamu
Saya kemudian mencoba memasukkan code JavaScript pada Buku Tamu:

Injeksi code JavaScript pada Buku Tamu

Hasil Injeksi code JavaScript pada Buku Tamu
- Tidak ada captha untuk melindungi buku tamu dari SPAMMER;
- Tidak adanya sanitasi input dan output untuk mencegah orang jahat menginjeksikan malicious script;
LOCAL File Inclussion (LFI)
Saya memulai mencari kelemahan lain yang
lebih serius. Saya menjumpai pemandangan menarik pada struktur URL
website Pemerintah kabupaten Sidoarjo. Perhatikan struktur URL halaman
“Informasi Kabupaten Sidoarjo” berikut:
http://www.sidoarjokab.go.id/main.php?content=selayang/geografis.html

Struktur URL Website Pemerintah Kabupaten Sidoarjo
main.php melewatkan path menuju file geografis.html yang terletak pada folder selayang/ melalui parameter content.
Kira-kira difilter nggak yach parameternya? atau semua yang dimasukkan
melalui parameter content ditangkap dan diinclude apa adanya? Saya
mencoba melakukan include file /etc/passwd dengan memasukkan ../../../../../../../../../etc/paswd pada parameter content:
http://www.sidoarjokab.go.id/main.php?content=/etc/paswd
http://www.sidoarjokab.go.id/main.php?content=../../../../../../../../../etc/paswd
Dan hasilnya..

Meng-include /etc/passwd melalui parameter content
Sesuai dengan yang saya harapkan
Isi file /etc/passwd yang berisi daftar user pada server ditampilkan
pada area content ^^” Dari hasil penelusuran saya, ada7 file yang
memiliki celah ini:

- http://www.sidoarjokab.go.id/main.php?content=[evil code]
- http://www.sidoarjokab.go.id/domain/dishub/index.php?content=[evil code]
- http://www.sidoarjokab.go.id/other/SdaAngka/index.php?data=[evil code]
- http://perijinan.sidoarjokab.go.id/main-content.php?load=[evil code]
- http://www.sidoarjokab.go.id/other/p3a/index.php?lok=[evil code]
- http://www.sidoarjokab.go.id/other/baz/index.php?content=[evil code]
- http://www.sidoarjokab.go.id/other/warintek/index.php?cont=[evil code]
Lalu sekarang bagaimana? apa yang bisa
kita lakukan dengan daftar user tersebut? Kita inject dengan shell
sederhana yang digenerate melalui error log? atau.. bagimana?
Sudahlah, biarkan saja dulu. Mari kita tinggalkan celah ini dan mencari celah keamanan lain yang lebih menarik 
INSUFFICIENT Authentication
Saya menelusuri setiap halaman web sidoarjokab.go.id untuk mencari struktur URL menarik lainnya. Kali ini saya mengamati struktur URL berita:

Struktur URL berita sidoarjokab.go.id
Ada lokasi yang menarik perhatian saya disana, yaitu directory /inter/ dan directory /inter/news/. Ada apa di kedua lokasi tersebut? Saya memulai dengan mengunjungi directory paling ujung, yaitu /inter/news/

File-file "mencurigakan"

Saya langsung disuguhi daftar file yang mengundang rasa penasaran saya
—> idih.. dari tadi isinya penasaran melulu ya.. ^^” Hmm.. kira-kira apa yach yang tampil kalau saya akses file-file tersebut..? Coba aja ah.. Saya mencoba mengakses file frm-vers_child.php


Form untuk input berita tidak dilindungi session
Wew!
Saya merasa sangat bahagia saat menyadari bahwa file tersebut adalah
form untuk menginputkan berita dan tidak dilindungi dengan session
Yang lebih menyenangkan lagi, ada fasilitas file upload yang sepertinya tidak difilter
Untuk memastikan dugaan saya, saya mengupload Web Shell menggunakan
fasilitas file upload tersebut. Setelah proses upload selesai, saya
memeriksa folder upload/




Web Shell berhasil diupload
YEY!!! file saya berhasil diupload! tuch, ada spyrozone.net.php
Dengan semangat 45, saya memanggil file tersebut:


Web Shell gagal dijalankan
Yaah… gagal nich… T_T
Tapi.. Tunggu dulu…! saya teringat dengan celah LFI yang sudah ditemukan tadi
Saya mencoba memanggil spyrozone.net.php dengan memanfaatkancelah LFI tadi:


Memanfaatkan LFI untuk menjalankan Web Shell
Yey! Web Shell saya tampil dengan indahnya
Sekarang, saya bisa menjelajahi webserver dan menjalankan
perintah-perintah shell melalui Web Shell. Biasanya, attacker hanya
memiliki kendali penuh atas suatu file pada directory yang memiliki file
permission 777 saja. namun dalam kasus ini, kesalahan konfigurasi pada
server menyebabkan attacker dengan mudah bisa melakukan pembuatan file
baru, edit, dan menghapus file apapun yang diinginkan


Setelah melakukan penelusuran kembali,
saya menemukan lokasi lain yang bisa dijadikan sebagai jalan bagi
attacker untuk menanam web shell:
http://www.sidoarjokab.go.id/sub/bappeda/files/index.php

File Explorer
Saya menemukan file explorer lengkap
dengan fungsi crete directory, upload file, delete dan download.
Kemungkinan besar file ini ditujukan bagi pengelola area download
BAPPEDA. namun, seperti yang Anda lihat, halaman ini tidak dilindungi
dengan session sehingga memungkinkan orang jahat untuk menanam web
shell.
UNENCRYPTED stored password
Saya mendapati file konfigurasi koneksi database terletak pada directory inter/config.inc

File konfigurasi koneksi database


Daftar username dan password pengguna CMS
Kini saya bisa masuk ke halaman Administrator dengan akun yang saya dapatkan:

Halaman Administrator sidoarjokab.go.id
Btw.. karena file koneksi databasenya
disimpan dalam extensi .inc, saya jadi penasaran. Kira-kira, apakah
akses menuju file .inc melalui browser sudah dicegah? Saya mencoba
mengakses file config.inc melalui browser:

Akses terhadap file .inc melalui browser
INSECURE Web Host
Pemerintah Kabupaten Sidoarjo menggunakan jasa web hosting dari PT. Data Utama Dinamika. Saya agak terdiam saat mengakses halaman /administrator/ website perusahaan tersebut:
http://www.datautama.net.id/administrator/
Bukan form login yang saya hadapi, tapi sebuah halaman yang berisi pesan Deface 

Pesan Deface pada Website PT. Data Utama Dinamika
Sepertinya sebelum beralih ke Flash, Data Utama Dinamika menggunakan JoomlaUser-agent: * Disallow: /administrator/ Disallow: /cache/ Disallow: /components/ Disallow: /editor/ Disallow: /help/ Disallow: /images/ Disallow: /includes/ Disallow: /language/ Disallow: /mambots/ Disallow: /media/ Disallow: /modules/ Disallow: /templates/ Disallow: /installation/

Hmm.. entahlah, yang jelas, ini bisa menjadi kabar baik bagi Si Pembuat CMS

Solusi
Sambil menunggu Admin melakukan
perbaikan pada sistem mereka, saya mencoba membantu Admin untuk menutup
beberapa celah keamanan yang telah saya bahas. Mudah-mudahan bisa
mempersingkat kerja Administrator dalam melakukan pemeriksaan menyeluruh
terhadap sistem mereka.
1. Mencegah HTML Injection
Sanitasi untuk mencegah HTML Injection bisa dilakukan pada input maupun output, atau pada keduanya agar lebih aman. Kali ini saya langsung memberi solusi pada output buku tamu saja. Berikut adalah potongan code asli Buku Tamu sidoarjokab.go.id<?while($rv_guest = mysql_fetch_array($qv_guest)) {?> <tr><td width="21%" valign="top">Nama</td><td width="2%" valign="top">:</td><td width="77%"> <?=$rv_guest[1]?> </td></tr><tr><td valign="top">Tanggal</td><td valign="top">:</td><td> <?=tglapp($rv_guest[0])?> </td></tr><tr><td valign="top">Alamat</td><td valign="top">:</td><td> <?=$rv_guest[2]?> </td></tr><tr><td valign="top">Kota</td><td valign="top">:</td><td> <?=$rv_guest[3]?> </td></tr><tr><td valign="top">E-mail</td><td valign="top">:</td><td> <?=$rv_guest[4]?> </td></tr><tr><td valign="top">Komentar</td><td valign="top">:</td><td> <?=nl2br($rv_guest[5])?> </td></tr>Terlihat pada baris ke 3,5,7,9,11,13, semua informasi ditampilkan apa adanya. Saya menambahkan htmlspecialchars() pada code tersebut sehingga menjadi demikian:
<?while($rv_guest = mysql_fetch_array($qv_guest)) {?> <tr><td width="21%" valign="top">Nama</td><td width="2%" valign="top">:</td><td width="77%"> <?=htmlspecialchars($rv_guest[1],ENT_QUOTES)?> </td></tr><tr><td valign="top">Tanggal</td><td valign="top">:</td><td> <?=tglapp(htmlspecialchars($rv_guest[0],ENT_QUOTES))?> </td></tr><tr><td valign="top">Alamat</td><td valign="top">:</td><td> <?=htmlspecialchars($rv_guest[2],ENT_QUOTES)?> </td></tr><tr><td valign="top">Kota</td><td valign="top">:</td><td> <?=htmlspecialchars($rv_guest[3],ENT_QUOTES)?> </td></tr><tr> <td valign="top">E-mail</td><td valign="top">:</td><td> <?=htmlspecialchars($rv_guest[4],ENT_QUOTES)?> </td></tr><tr> <td valign="top">Komentar</td><td valign="top">:</td><td> <?=nl2br(htmlspecialchars($rv_guest[5],ENT_QUOTES))?> </td></tr><tr>Kini, jika ada orang iseng yang mencoba menginjeksikan script berbahaya, maka script tersebut akan tampil apa adanya:

Halaman buku tamu setelah diamankan
2. Sanitasi Input Untuk mencegah LFI
Untuk melindungi Website Pemerintah Kabupaten Sidoarjo, saya menyisipkan code yang berfungsi untuk melakukan filtering terhadap nilai yang dilewatkan melalui parameter content:/* Pencegahan sementara untuk celah LFI SPYRO KiD Web : http://www.spyrozone.net Mail : root/at/spyrozone.net */ $secured_by_spyrokid = $_REQUEST["content"]; $up_dir = strrpos($secured_by_spyrokid, ".."); if($up_dir === false){ $root_dir = substr($secured_by_spyrokid, 0,1); if($root_dir=="/") { header("location: http://www.sidoarjokab.go.id/"); exit; } }else{ header("location: http://www.sidoarjokab.go.id/"); exit; } $content = $secured_by_spyrokid;
Filter diatas saya sesuaikan dengan
kondisi website Pemerintah Kabupaten Sidoarjo agar tidak merusak halaman
lain. Jika ada Attacker yang mencoba memanipulasi URL untuk memeriksa
adanya celah LFI, maka attacker akan dilempar ke halaman utama website
Pemerintah Kabupaten Sidoarjo.
3. Mencegah Directory View
Andai saja directory view dinonaktifkan,
Attacker mungkin tidak akan pernah tau adanya form input dan edit
berita yang tidak diproteksi dengan session. Cara mendisable directory
view cukup mudah, yaitu dengan menambahkan code berikut pada .htaccess
Sekarang, Attacker tidak akan bisa melihat adanya file-file sensitif tersebut:IndexIgnore *

Disable Directory View
User akan disuguhi pesan Error 403 Forbidden saat mencoba mengakses halaman tersebut.Options -Indexes
4. Mencegah Akses terhadap File .inc
Untuk mencegah akses agar file-file
konfigurasi koneksi database yang disimpan pada file .inc diintip oleh
orang lain melalui browser, tambahkan code berikut pada .htaccess
<Files ~ "\.inc$"> Order Allow,Deny Deny from All </Files>
Jika ada orang iseng yang mencoba mengakses file .inc melalui browser, maka akses menuju file tersebut akan ditolak:

Akses terhadap file .inc melalui browser ditolak
5. Enkripsi Informasi Sensitif Pada Database
Jangan menyimpan password user pada
database dalam keadaan telanjang tanpa enkripsi. Tujuan dari enkripsi
adalah untuk menyembunyikan password sebenarnya agar attacker tidak bisa
memanfaatkan password tersebut sekalipun jika suatu ketika isi tabel
user bocor.
6. Pintar Memilih Web Hosting
Saya tidak bermaksud menyarankan
Pemerintah kabupaten Sidoarjo untuk pindah layanan hosting, lho ^^” Di
balik celah-celah keamanan dan kelalaian pada layanan PT. Data Utama
Dinamika, perusahaan tersebut pasti memiliki banyak sekali keunggulan
(tapi saya kurang tau dimana keunggulannya, karena kebetulan saya bukan client mereka ^^)

Saya hanya menyarankan untuk kita semua
agar pintar memilih Web Hosting. Percuma bukan jika kita mendapat
layanan dengan harga murah dan fitur berlimpah jika perusahaan tersebut
memiliki reputasi yang buruk dalam keamanan ^^” Jadikan faktor keamanan
sebagai faktor utama sebelum Anda memutuskan untuk mempercayakan
data-data penting Anda pada suatu perusahaan

7. Perlindungan Lainnya
Untuk perlindungan terhadap celah lainnya, silahkan Anda baca kembali Solusi pada kasus Celah Keamanan Pada Website JAMSOSTEK.
PENUTUP
Saat ini, celah-celah yang ada pada
pembahasan ini sudah ditutup sesuai dengan solusi yang telah saya bahas.
Besar kemungkinan masih banyak celah lain pada portal Pemkab Sidoarjo
yang belum masuk pada pembahasan saya. Anda menemukan celah baru?
silahkan mengirimkan celah baru yang Anda temukan ke email saya. Saya
akan menambahkan celah keamanan tersebut pada artikel ini beserta solusi
untuk Administrator dengan mencantumkan kredit kepada Anda

0 komentar