Dunia web-developing saat ini sudah berkembang sangat jauh dibanding
masa dulu. Banyak aplikasi yang bagus yang terus dikembangkan untuk
diimplementasikan melalui interface web. Banyaknya perkembangan dalam
dunia web tidak hanya berdampak kepada end-user dan developer, tetapi
juga oleh orang-orang yang jahat dan iseng untuk mengganggu kenyamanan
orang lain selama menikmati dunia maya.
Beberapa waktu lalu saya sudah pernah menceritakan mengenai
SQL Injection
yang merupakan salah satu celah dalam pengembangan situs web. SQL
Injection sendiri merupakan celah yang mengakibatkan penyusup dapat
menyusupkan kode SQL ke server database yang ada.
Saat ini seringkali di dunia web-developing kita mendengar juga kata
XSS dan CSRF. Sebenarnya apa yang dimaksud dengan XSS dan CSRF? Kita
akan membahas satu persatu.
XSS merupakan singkatan dari Cross-site
Scripting. Sedangkan CSRF (dibaca Sea-surf) atau XSRF merupakan
singkatan dari Cross-site Request Forgery. Berbeda dengan SQL Injection
yang dieksekusi di server, XSS dan CSRF digunakan dengan memanfaatkan
celah yang ada dalam browser saat menampilkan halaman web.
Cross-site Scripting
Bagi beberapa orang, untuk mengerti mengenai XSS agak sulit.
Pengetahuan mengenai HTML dan bahasa pemrograman web diperlukan agar
seseorang dapat mengerti XSS ini karena memang XSS memanfaatkan HTML
serta kecerobohan programmer dalam pengolahan HTML melalui bahasa
pemrograman web yang digunakan. Oleh sebab itu XSS seringkali juga
disebut
HTML Injection.
Beberapa programmer web pemula umumnya tidak terlalu memperhatikan
bahaya XSS sehingga saat ini banyak celah XSS yang bisa ditemukan pada
situs web yang dirancang. XSS pun cenderung tampak “kalah pamor”
dibanding dengan SQL Injection sehingga tidak banyak orang yang
memerhatikan hal ini.
Contoh implementasi XSS
Kita lihat baris kode berikut:
<html>
<head>
<title>XSS</title>
</head>
<body>
<?php if($_GET['keyword']) : ?>
<h1><?php echo $_GET['keyword']; ?></h1>
<?php endif; ?>
<form action="xss.php">
<label>Masukkan kata yang mau dicari: <input name="keyword" /></label>
</form>
</body>
</html>
Misalkan penggalan kode di atas digunakan untuk mencari suatu kata
dalam suatu dokumen. Kata yang digunakan dalam pencarian akan
ditampilkan setelah disubmit. Ketika baris kode ini dijalankan, maka
akan tampil seperti di bawah ini:

Anggaplah kita memasukkan sebuah kata untuk dicari yaitu “lorem ipsum”:

Pada gambar di atas, kata yang dicari akan ditampilkan sebagai header atau judul. Sekarang kita masukkan kata “<
img src=
http://a.wordpress.com/avatar/unknown-48.jpg />” ke dalam box yang tersedia. Maka ketika di-submit, tampilan dari halaman itu akan berubah menjadi

Secara logika bila yang dimasukkan ke dalam field adalah keyword “<
img src=
http://a.wordpress.com/avatar/unknown-48.jpg />”
maka yang akan tampil adalah keyword itu juga bukan? Tapi dalam contoh
di atas ternyata yang muncul adalah gambar dari suatu website.
Gambar tersebut bisa muncul karena pada baris 6 kode PHP di atas,
keyword yang dimasukkan otomatis dianggap sebagai bagian dari HTML yang
berfungsi untuk menampilkan gambar dari website tersebut. Bahkan bila
halaman di atas menggunakan metode GET untuk menampilkan halamannya,
cukup dengan menulis URL webpage tersebut ditambah dengan query string
“keyword”. Misalnya:
http://localhost/xss.php?keyword=%3Cimg+src%3Dhttp %3A%2F%2Fa.wordpress.com%2Favatar%2Funknown-48.jpg+%2F%3E
Dengan menggunakan URL tersebut, korban yang membukanya akan
menampilkan halaman yang sama dengan gambar ketiga di atas. Walaupun
kebanyakan webserver dan browser membatasi jumlah karakter dalam URL
yang dapat diterima dan dikirim, tapi tetap saja hal ini membuka
peluang bagi orang-orang yang tidak bertanggung jawab untuk menampilkan
“sebuah halaman web palsu” melalui kelemahan ini.
Pencegahan XSS
Lalu bagaimana agar hal ini tidak terjadi? Pada dasarnya terdapat 2 metode untuk mencegah XSS. Pertama adalah dengan melakukan
escape sebelum
output ditampilkan. Cara ini adalah cara termudah untuk
diimplementasikan tapi sangat rentan terlewatkan karena kecerobohan
programmer.
Pada contoh di atas, programmer harus melakukan
escape
terhadap keyword yang akan ditampilkan. Escape di sini agak berbeda
dengan escape yang saya jelaskan di SQL Injection. Di sini kita akan
mengubah entitas atau tanda HTML khusus agar tidak dianggap sebagai
kode HTML. Entitas tersebut adalah:
- < menjadi <
- > menjadi >
- & menjadi &
- ” menjadi "
- ‘ menjadi ' atau '
Masih banyak entitas lain dalam HTML yang dapat digunakan, akan
tetapi kelima entitas di atas lah yang paling berperan penting agar
ekskusi XSS dapat terjadi.
Dalam PHP, kita dapat menggunakan
htmlspecialchars($string)
untuk melakukan escape terhadap entitas di atas. Sebagai contoh, kita
akan perbaiki penggalan kode di atas menjadi seperti di bawah ini:
<html>
<head>
<title>XSS</title>
</head>
<body>
<?php if($_GET['keyword']) : ?>
<h1><?php echo htmlspecialchars($_GET['keyword']); ?></h1>
<?php endif; ?>
<form action="xss.php">
<label>Masukkan kata yang mau dicari: <input name="keyword" /></label>
</form>
</body>
</html>
Kemudian kita jalankan lagi halaman tersebut dengan memasukkan input keyword “<
img src=
http://a.wordpress.com/avatar/unknown-48.jpg />”, dan hasilnya menjadi seperti di bawah ini:

Di atas, kode HTML yang “disuntikkan” telah di-escape sehingga
ditampilkan seperti seharusnya sehingga keyword di atas tidak lagi
berbahaya.
Metode kedua untuk mencegah terjadinya XSS adalah melakukan stripping atau menghilangkan tag-tag HTML (umumnya menggunakan
regular expression).
Selain itu juga dapat dilakukan dengan menghilangkan entitas < dan
> agar input tidak dikenali sebagai HTML saat di-output kembali.
Metode kedua memiliki kekurangan yaitu tidak dapat menampilkan input
yang asli karena telah dilakukan penghapusan atau pemotongan terhadapa
beberapa tanda atau kata yang belum tentu berbahaya. Selain itu cara
ini juga lebih sulit daripada metode pertama karena programmer harus
melakukan list terhadap tag-tag HTML yang dianggap berbahaya dan juga
harus mengerti mengenai penggunaan regular expression.
Jenis XSS
Terdapat 3 tipe XSS.
Tipe 0 merupakan tipe yang dapat
mengakibatkan eksekusi kode secara lokal sehingga penyerang dapat
mengendalikan komputer korban secara tidak langsung melalui file-file
yang sudah disembunyikan. Kebanyakan browser saat ini sudah menutup
celah ini dengan melarang eksekusi kode lokal dari situs yang online.
Tipe 1 merupakan tipe XSS yang tidak berlanjut atau
non-persistence.
Penyerang umumnya memanfaatkan form atau metode GET yang ada dalam
protokol HTTP. Kode “disuntikkan” melalui URL yang dijalankan di
address bar browser tersebut. Kode yang disuntikkan tidak disimpan
dalam database sehingga XSS yang dijalankan tidak bersifat lanjutan
karena korban harus mengikuti URL yang terinfeksi atau melakukan
instruksi yang ada untuk membuka XSS. Contoh yang ada di atas adalah
contoh tipe 1.
Tipe 2 merupakan tipe XSS yang tereksekusi secara berlanjut atau
persistence.
Penyerang memanfaatkan database untuk menyimpan kode berbahaya sehingga
ketika user lain membuka halaman yang akan menampilkan kode tersebut
akan tertipu dengan XSS. Cara ini umumnya digunakan pada forum diskusi
ataupun blog dan dapat menyebabkan banyak korban bila tidak ditangani
dengan baik.
Cross-site Request Forgery
Tidak berbeda jauh dengan XSS. CSRF merupakan singkatan Cross-site
Request Forgery. Sama-sama menggunakan metode lintas situs. Hanya saja
CSRF ini akan lebih mudah dimengerti.
Ketika kita membuka sebuah situs, browser secara otomatis akan
mengirim request atau permintaan kepada web-browser. Begitu pula ketika
browser menemukan kode HTML yang meminta file agar didownload ke
browser. Kode HTML <img>, <object>, <link> dan
<script> yang mencantumkan sebuah link ke objek yang akan
di-request otomatis oleh browser ke web browser. Contohnya adalah
<img src=”http://www.example.com/gambar.jpg” alt=”gambar” /> yang
bila dimasukkan ke dalam source HTML, maka otomatis web-browser akan
mengirimkan request untuk gambar tersebut.
Bila kode tersebut diubah menjadi <img
src=”http://www.example.com/logout.php” />, browser tetap akan
menganggap bahwa terdapat gambar atau image yang harus didownload
sehingga browser pun mengirim request kepada web-server untuk halaman
itu. Pada akhirnya seolah-olah user melakukan logout dari situs
tersebut.
Sebuah contoh lagi, bila terdapat situs bank
www.bank-abc.com
dan terdapat suatu halaman situs dengan kode <img
src=”http://www.bank-abc.com/transfer.php?dari=Alice&jumlah=50000000&untuk=Malory”
/>. Ketika Alice membuka halaman tersebut dan kebetulan Alice sedang
login atau memilki sesi di www.bank-abc.com, maka transfer uang akan
dilakukan ke rekening Malory tanpa diketahui oleh Alice. Hanya saja
saat ini tidak banyak bank yang menerapkan transfer uang melalui metode
GET seperti di atas karena cukup berbahaya.
CSRF banyak digunakan pada forum diskusi maupun tempat lain yang
mendukung penggunaan tag <img>, <object>, <link> dan
<script>. Akan tetapi lebih banyak situs yang hanya
memperbolehkan tag <img>. Cara untuk mencegah terjadinya serangan
CSRF adalah membatasi ekstensi yang dapat digunakan sesuai dengan tag
yang ada. Misalnya .jpg, .gif dan .png untuk tag <img>, .js untuk
<script> dan sebagainya. Kelemahan dari metode ini adalah bahwa
pada kenyataannya file yang terdapat di web tidak selalu sesuai dengan
ekstensi yang ada. Seringkali saat ini untuk menampilkan gambar secara
dinamis, developer menggunakan .php atau .asp sehingga gambar dapat
di-generate dengan kode yang ada.
Cara terbaik justru datang dari sisi user dimana akan lebih baik
kalau setiap kali selesai menggunakan suatu situs web melalui proses
login, user tersebut juga harus melakukan logout. Developer juga harus
bertanggung jawab dengan membuat link untuk logout atau mengingatkan
user untuk logout bila selesai menggunakan situsnya atau menerapkan
sesi terbatas.
Kesimpulan
CSRF dan XSS memanfaatkan celah dari kecerobohan programmer dan
developer. Selain itu unsur ketidaktahuan dari sisi user juga
mengakibatkan tipe serangan ini mudah dilakukan.
berbagai sumber
…Semoga Bermanfaat…
!.Semoga Sukses.!
.send komentar ya.