about XSS dan CSRF

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:
Gambar 1: Tampilan asli dari website.
Anggaplah kita memasukkan sebuah kata untuk dicari yaitu “lorem ipsum”:
Gambar 2: Dengan kata
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
Gambar 3: Gambar setelah kode
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 &lt;
  • > menjadi &gt;
  • & menjadi &amp;
  • ” menjadi &quot;
  • ‘ menjadi &#0039; atau &apos;
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:
Gambar 4: Setelah dilakukan escape
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.




Artikel terkait:

{ 0 komentar... read them below or add one }

Poskan Komentar

terima kasih telah berkunjung sobat.
Silahkan komentar,kritik dan sarannya
setidaknya tegur sapa.heheh