Browser memprovokasi crash dengan fuzzing perilaku

gambar

Pada artikel ini, saya akan memberitahu Anda bagaimana saya menggunakan fuzzing untuk menemukan beberapa crash di Firefox. Biasanya, tujuan fuzzing adalah menemukan kegagalan yang mengindikasikan kerusakan memori, tetapi tujuan saya berbeda: Saya ingin mendeteksi reaksi peramban yang tidak terduga. Ini bisa berupa karakter yang membuka atau menutup tag yang tidak biasa, atau mungkin karakter yang diabaikan oleh pengurai JavaScript. Reaksi tak terduga semacam itu sering dapat digunakan untuk melakukan serangan XSS, melewati filter keamanan dan menghindari kotak pasir JavaScript.

Kesalahan pertama yang ingin saya bicarakan adalah bagaimana menutup komentar HTML dengan cara yang berbeda. Jika Anda membaca spesifikasi HTML, Anda tahu bahwa komentar dapat ditutup dengan -> atau -!>. Tetapi bagaimana melakukannya secara berbeda? Pertanyaan bagus untuk memulai fuzzing! Anda hanya perlu membuat kode yang akan memberikan jawabannya.

Kembali pada 2008, ketika saya merakit Shazzer untuk menghilangkan perilaku browser, saya dibatasi sekitar 10.000 arah per halaman. Hari ini, pada tahun 2019, semuanya bekerja lebih cepat, sehingga kita dapat lebih sering melakukan fuzz. Selain itu, menggunakan DOM mempercepat fuzzing karena Anda tidak perlu lagi menambahkan setiap arah ke dokumen saat ini. Perlu dicatat bahwa ini adalah pendekatan yang tidak dapat diandalkan, karena Anda bisa mendapatkan hasil yang berbeda. Memang, saya telah menemukan kasus di mana DOM memungkinkan nilai nol dalam argumen atribut seperti href, tetapi parser HTML tidak. Ini masih merupakan kegagalan yang tidak kritis, tetapi Anda tidak selalu dapat mempercayai hasilnya untuk mendapatkan gambaran lengkap tentang apa yang akan dilakukan parser HTML. Namun, dalam banyak kasus ini berfungsi, dan ini jauh lebih cepat daripada output HTML dari sisi server.

Langkah pertama telah diambil - kami memiliki pertanyaan: "Karakter apa yang dapat menutup komentar HTML?". Untuk menjawabnya, kita perlu menggunakan karakter yang ada yang akan menutup komentar HTML dan menghilangkan karakter yang tidak kita ketahui. Langkah selanjutnya adalah menggunakan perangkat lunak fuzzing yang sesuai. Dalam kasus saya, saya menggunakan alat Hackvertor saya, tetapi menggunakan server web lokal saya dapat mencapai hasil yang sama. Gagasan alat ini adalah untuk memasukkan input ke dalam kolom input, sedikit mengonversi tag, dan melakukan sesuatu dengan output. Karena kita tidak memiliki apa pun untuk dikonversi, kita dapat menempatkan kode kita langsung di bidang output. Oleh karena itu, klik pada area output teks dan buat array untuk menyimpan karakter fuzzy dan elemen div untuk menguji HTML:

log = []; div=document.createElement('div'); 

Maka kita perlu menghapus lebih dari 1.000.000 karakter Unicode atau, lebih tepatnya, 0x10ffff. Yang dibutuhkan hanyalah loop untuk:

 for(i=0;i<=0x10ffff;i++){ 

Lalu kami menggunakan kembali elemen div yang kami buat untuk setiap karakter. Dalam hal ini, saya menguji posisi setelah! Sehingga karakter akan dimasukkan setelah! .. Kemudian saya menggunakan elemen img untuk melihat apakah fuzzing berhasil. Jika elemen ini ada, maka komentar HTML telah ditutup, dan kami memiliki beberapa karakter yang menarik!

 div.innerHTML = '<!-- --!'+String.fromCodePoint(i)+'><img>-->'; 

Akhirnya, dengan kueriSelektor kami memeriksa apakah img ada dan menambahkan karakter ke log. Lalu saya menutup pernyataan if dan for for. Akhirnya, saya memasukkan hasil di bidang input di sebelah kiri:

 if(div.querySelector('img')){ log.push(i); } } input.value=log 

Ini adalah versi lengkap kodenya. Anda perlu membuka URL di Firefox, dan kemudian memasukkan karakter input di bidang output dan klik tombol "Execute JS" untuk menghapus karakter. Setelah menyelesaikan fuzzing, Anda akan melihat angka-angka di bidang input, mereka sesuai dengan kode karakter yang berhasil. Pada saat penulisan, Firefox (versi 67) masih memungkinkan karakter baris baru - \ n dan \ r - setelah !, untuk menutup komentar. Saya diberitahu bahwa ini telah diperbaiki di versi Firefox yang akan datang. Jadi, tahap terakhir fuzzing adalah membangun payload Anda, itu cukup sederhana. Anda perlu mengganti kode karakter dengan karakter dan menambahkan payload XSS:

 <!-- --! ><img src=1 onerror=alert(1)> --> 

Anda dapat menggunakan Hackvertor lagi untuk menguji operasinya dengan menempelkan di atas ke dalam bidang output dan kemudian mengklik "Tes HTML". Jendela peringatan akan muncul karena Firefox (versi 67) menyelesaikan baris baru sebagai bagian dari komentar terakhir.

Jadi ini memungkinkan kami untuk menemukan kesalahan yang tidak penting di parser Firefox HTML. Ayo cari yang lain! Kami membutuhkan pertanyaan baru: "Karakter apa yang dapat membuka komentar HTML?". Alih-alih melampaui komentar HTML yang ada, kami sekarang akan menggunakan komentar HTML untuk melampaui atribut HTML yang ada. Seperti yang saya yakin, Anda semua tahu bahwa Anda dapat membuka komentar HTML dengan <! -. Apakah itu benar? Kami akan menggunakan kode yang sama lagi, tetapi kali ini mengubah tujuan innerHTML untuk memeriksa apakah komentar terbuka:



Dengan demikian, simbol yang kita fuzzy akan setelah tanda hubung pertama. Jika karakter berhasil membuat komentar HTML pembuka, itu akan mengomentari elemen div dan dengan demikian keluar dari atribut judul. Kali ini, ketika kami menjalankan "Execute JS", kami mendapatkan dua hasil di Firefox (versi 67): "0.45". Kode 45 diharapkan karena itu adalah tanda hubung, tetapi 0 adalah karakter NULL! Ini berarti Firefox menginterpretasikan urutan <! - NULL- sebagai komentar terbuka. Semacam permainan! (Saya pikir penyedia browser perlu lebih banyak fuzzing perilaku =)). Untuk menyelesaikan test case ini, sekarang kita harus membuat arahan kita. Mari kita lakukan hal yang sama: sekali lagi, ganti fungsi String.fromCodePoint dengan simbol NULL dan XSS dengan arah:

 document.body.innerHTML = '<!-\x00- ><div title="--><img src=1 onerror=alert(1)>"></div>'; 

Mari beralih ke JavaScript alih-alih HTML. Saya menguji setiap browser dan saya minta maaf Mozilla, tetapi Firefox membuat beberapa jenis permainan lagi. Saya terinspirasi oleh fakta bahwa fuzzing dari tweet jinmo123 menggunakan fitur ES6 baru yang menarik untuk memanggil fungsi tanpa tanda kurung. Pertanyaan yang saya ajukan untuk fuzzing adalah: "karakter apa yang diizinkan setelah masuk atau dari operator?" Kemudian kita kembali membuat kode di Hackvertor, mengikuti pola yang sama, tetapi kali ini tidak menggunakan DOM. Pertama, buat array dan loop untuk:

 log = []; for(i=0;i<=0x10ffff;i++){ 

Kemudian kita akan menggunakan eval alih-alih innerHTML untuk menghilangkan nilai-nilai kita. Pertama, kita perlu menggunakan blok uji coba untuk mendeteksi pengecualian yang disebabkan oleh karakter yang tidak valid.

 try{ eval("/a/"+String.fromCodePoint(i)+"instanceof function(){}"); 

Fungsi eval digunakan untuk melihat apakah JavaScript kami valid. Jika demikian, itu akan pergi ke baris berikutnya, jika tidak, itu akan membuang pengecualian yang akan diperhatikan, dan kemudian pergi ke karakter berikutnya. Baris berikutnya hanya mendaftarkan karakter, dan kemudian menutup blok try catch dan for loop. Fungsi kemudian menampilkan hasil di bidang input.

 log.push(i); }catch(e){} } input.value=log 

Jika Anda menjalankan kode ini menggunakan "Execute JS", Anda akan mendapatkan banyak hasil! Firefox mengabaikan banyak karakter. Jika Anda mencoba kode di Chrome, Anda akan mendapatkan hasil yang lebih masuk akal. Temukan kode karakter di bidang input yang ingin Anda gunakan, dalam kasus saya itu adalah "1114110" atau "0x10fffe" dalam hex. Sekarang kita akan membuat vektor JavaScript kita:

 eval("1337"+String.fromCodePoint(1114110)+"in"+String.fromCodePoint(1114110)+"alert(1337)"); 

Anda juga dapat membayangkannya di dalam skrip SVG:



Konfigurasi prosesor ganda terbaru dari server khusus dengan prosesor Intel Scalable 2019 tersedia di DEDIC.SH :
  • 2x Xeon Silver 4214 - total 24 core
  • 2x Xeon Gold 5218 - total 32 core
  • 2x Xeon Gold 6240 - konfigurasi dengan 36 core.

Biaya server dengan dua Xeon Silver 4214 - dari 15210 rubel / bulan
Kami juga siap mengumpulkan konfigurasi apa pun untuk Anda - kirim surat kepada kami !

Jika kekuatan besar dari server khusus tidak diperlukan - VDS dari 150 rubel / bulan adalah yang Anda butuhkan!

Source: https://habr.com/ru/post/id455602/


All Articles