Bypass Filter XSS Menggunakan URI Data
URI data, seperti yang didefinisikan dalam RFC 2397, adalah cara cerdas untuk menyematkan file kecil dalam satu baris dalam dokumen HTML. Alih-alih menautkan ke file yang disimpan secara lokal di server, file tersebut disajikan sebagai string data yang disandikan base64 yang diawali dengan tipe mime di URL itu sendiri. Artikel ini menjelaskan cara menggunakan URI data secara efektif untuk melakukan serangan skrip lintas situs (XSS). Informasi dalam artikel ini bukanlah hal baru. Ini adalah upaya untuk mengeksplorasi berbagai cara untuk melakukan XSS menggunakan URI data.
Ikhtisar URI data
URI data adalah tautan self-contained. Ini berisi data dokumen dan metadata yang sepenuhnya dienkapsulasi dalam URI. The'data:' URI sepenuhnya mandiri dan tidak menyertakan nama file. Saat ditampilkan dengan 'data:', URI tipe MIME yang memicu dialog penyimpanan, seperti 'aplikasi/octet-stream', akan mencoba menyimpan konten URI sebagai file di sistem file lokal.
sintak:
data:[mediatype][;base64],data
Type media adalah string jenis MIME seperti "gambar / jpeg" untuk file gambar JPEG. Jika dihilangkan, defaultnya adalah text/plain; charset = US-ASCII. Jika data berupa teks, Anda cukup menyematkan teks (gunakan entitas yang sesuai atau escape berdasarkan type dokumen yang Anda lampirkan). Jika tidak, Anda dapat menentukan base64 untuk menyematkan data biner yang disandikan base64.
Gambar dalam dokumen HTML secara tradisional dihubungkan dengan tag seperti berikut:
<img src="images/myimage.gif">
Dalam hal ini, atribut image tag src menentukan sumber daya eksternal. Saat merender halaman, browser mengirimkan permintaan HTTP ke semua sumber daya eksternal. Dengan URI data, data gambar menjadi bagian dari dokumen HTML itu sendiri, seperti yang diilustrasikan oleh tag di bawah ini.
<img src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///
ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsap
yuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5
lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi
4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6
mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tu
NNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7">
Anda dapat melihat gambar yang sama yang dirender oleh browser dari string yang disandikan base64 pada gambar berikut.
Batasan URI data
Skema URI "data:" hanya berguna untuk nilai pendek. Ingatlah bahwa beberapa aplikasi yang menggunakan URL mungkin memberlakukan batasan panjang. Misalnya, Mozilla pada dasarnya mendukung URI data dengan panjang tidak terbatas, tetapi browser tidak harus mendukung data dengan panjang maksimum tertentu. Browser Opera membatasi URI data hingga sekitar 4100 karakter.
Dukungan browser web
URI data didukung oleh sebagian besar browser, termasuk (namun tidak terbatas pada) Firefox (dan browser berbasis Gecko lainnya), Safari Apple, Konqueror, dan Opera. Namun, Microsoft Internet Explorer 7 dan di bawahnya saat ini tidak didukung. Internet Explorer 8 dan yang lebih baru hanya mendukung URI data gambar CSS.
Mengapa data URI adalah ide yang bagus
Ada beberapa situasi di mana URI data dapat berguna, berbeda dengan referensi sumber daya eksternal tradisional.
Saat menjelajahi situs web HTTPS yang aman, browser web biasanya perlu mengunduh semua elemen halaman web melalui koneksi yang aman. Jika tidak, pengguna akan diberi tahu bahwa keamanan telah dikompromikan karena campuran elemen aman dan tidak aman. Permintaan HTTPS memiliki keunggulan signifikan dibandingkan permintaan HTTP biasa, sehingga menyematkan data dalam URI data bisa lebih cepat dalam kasus ini.
Browser web biasanya dikonfigurasi untuk membuat hanya sejumlah tertentu koneksi HTTP simultan ke domain. Oleh karena itu, data sebaris merilis koneksi unduhan untuk konten lain.
Karena ukuran gambar yang sangat kecil, menempatkan gambar sebaris dalam HTML menghemat overhead dari seluruh permintaan HTTP.
Digunakan di lingkungan di mana akses ke sumber daya eksternal rumit atau dibatasi.
Gambar dihasilkan secara dinamis oleh program sisi server untuk setiap kunjungan.
Data URI juga memiliki kekurangan. URI data dapat dieksploitasi untuk mengeksploitasi kerentanan dalam aplikasi web. Misalnya, Anda dapat menggunakan fitur ini untuk melakukan skrip lintas situs di aplikasi web Anda. Aspek URI data ini akan dibahas lebih detail dalam artikel ini.
XSS Dengan Data URI
XSS adalah jenis kerentanan keamanan yang ditemukan di aplikasi web yang memungkinkan penyerang jahat menyuntikkan skrip sisi klien ke halaman web yang dilihat oleh pengguna lain. Penyerang dapat mengeksploitasi kerentanan skrip lintas situs yang dieksploitasi untuk menghindari kontrol akses, seperti kebijakan asal yang sama, mencuri informasi sensitif, atau memasang kuda Trojan.
Ini dapat dicapai dengan membuat halaman web berbahaya yang berisi HTML atau kode skrip yang menggunakan skema URI "data:". Seperti yang dapat Anda lihat pada contoh di bawah, menggunakan URI data adalah alternatif yang efisien dan layak.
Bayangkan Anda memiliki input pengguna yang tercermin dalam respons di dalam tag tebal.
<b>Welcome USER_INPUT</b>
Aplikasi web telah membuat daftar hitam penggunaan kata kunci berikut dalam input pengguna:
- Skrip, JavaScript, peringatan, tanda kurung, tanda kutip ganda, titik dua.
Untuk menjalankan javascript, Anda perlu menggunakan tag <script>. Anda tidak dapat menggunakan tag <script> karena aplikasi Anda memvalidasi input pengguna untuk kata kunci tertentu. Jadi mari kita gunakan URI data untuk mengeksekusi JavaScript. Anda sekarang dapat menyuntikkan muatan berikut:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGV
sbG8iKTs8L3NjcmlwdD4="></object>
Eksekusi skrip yang dimasukkan ditunjukkan di bawah ini.
Detail
Di sini kami menggunakan payload URI data sebagai nilai yang ditetapkan ke atribut "data" dari tag "objek". Tag <object> digunakan untuk memasukkan objek seperti gambar, audio, video, applet Java, ActiveX, PDF, dan Flash. Atribut "data" dari tag objek mendefinisikan URL yang mereferensikan data objek.
Data dalam URI "data:" dikodekan sebagai string base64:
- Base64-encoded payload: HNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
- Base64-decoded payload: <script>alert("Hello");</script>
Saat browser memuat tag objek, objek yang ditetapkan ke atribut data (dalam hal ini javascript) dimuat. Ini akan mengeksekusi JavaScript. Saya dapat melewati filter daftar hitam karena muatan yang disandikan base64. Bisakah saya menggunakan tag IFRAME alih-alih objek?
Teknik ini juga memungkinkan Anda membuat file dari berbagai jenis MIME secara dinamis. Penyerang dapat membuat file DOC dan PDF yang dapat berisi muatan berbahaya untuk mengeksploitasi berbagai kerentanan luapan. Seorang penyerang juga bisa membuat pintu belakang. Pintu belakang memulai koneksi baru atau mendengarkan koneksi baru. Menghasilkan Netcat dapat menjadi pilihan. Misalnya, tautan berikut ini membuka dokumen Word mandiri.
data:application/msword;base64,0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7
/............
Eksekusi skrip ditunjukkan di bawah ini.
Saat menggunakan URI data
Salah satu solusi yang diterapkan untuk melindungi aplikasi web dari XSS adalah blacklist kata kunci. Pengembang aplikasi web membuat daftar hitam kata kunci khusus seperti javascript, skrip, peringatan, dan tanda kurung. URI data memungkinkan Anda menggunakan string yang disandikan base64 sebagai muatan injeksi. Ini membantu untuk melewati filter berdasarkan pendekatan daftar hitam. Dalam hal ini, penggunaan URL data benar-benar bermanfaat.
Aplikasi web juga memvalidasi input pengguna dalam berbagai pengkodean. Data URI memungkinkan Anda untuk menentukan pengkodean karakter data. Anda dapat menyandikan data Anda menggunakan kumpulan karakter yang validasinya belum diterapkan oleh aplikasi web Anda. Ini membantu untuk melewati validasi input pengguna yang hanya berlaku untuk pengkodean karakter tertentu.
Hasilkan POP-UP menggunakan CharsetUTF-7:
data:text/html;charset=utf-7;base64,PGh0bWw+DQo8aGVhZD4NCjx0aXRs
ZT5XZWxjb21lITw..................
Eksekusi skrip ditunjukkan di bawah ini.
Data URI memungkinkan Anda untuk menentukan pengkodean karakter data. Karena file dibuat dengan cepat saat tautan dijalankan, konten data sudah ada di browser pengguna dan dapat digunakan untuk memintas perlindungan antivirus yang dijalankan pengguna.
Menguji cakupan XSS menggunakan URI data
URI data dapat digunakan sebagai muatan dengan sangat sedikit tag HTML. Ini terbatas pada tag yang membaca sumber daya eksternal dengan membuat permintaan baru.
Berikut adalah beberapa tag HTML yang dapat membawa muatan URI data:
- Tag Anchor
- Tag IFRAME
- Tag objek
- Tag gambar
File berbahaya dapat dibuat dengan cepat, tetapi pengguna harus menyimpan dan menjalankannya. Efek penggunaan URL "data" yang panjang dalam aplikasi Anda belum diuji.
Kesimpulan
URI data hanya dapat digunakan dengan beberapa tag HTML, tetapi mereka membantu melewati filter XSS berbasis daftar hitam. URI data memungkinkan Anda membuat file dengan tipe MIME yang berbeda secara dinamis. Situs yang menggunakan proxy firewall untuk melarang perolehan jenis media tertentu (seperti bahasa skrip aplikasi atau jenis dengan masalah keamanan yang diketahui) termasuk jenis tersebut menggunakan skema URL "data". Sulit untuk menyaring apakah atau tidak.
- Referensi
- RFC-2397
- Tes URI data
- XSS mandiri
- Dekoder Base64-Encoder
- lembar contekan XSS