Menggunakan Dom Invander Untuk Menemukan Prototype Pollution
Tahun lalu, ketika kami memperkenalkan alat baru bernama DOM Invader, menemukan DOMXSS menjadi lebih mudah. Tahun ini, kami telah meningkatkan DOM Invader untuk mempermudah menemukan CSPP (client-side prototype pollution) hanya dengan beberapa klik. Jika Anda ingin menemukan, menemukan, dan memperbaiki kerentanan prototype sisi klien, Anda benar-benar perlu membaca-menemukan bagaimana DOM Invader hidup membuat Anda lebih mudah.
Apa itu prototype poluttion?
Prototype poluttion adalah kerentanan yang terjadi saat menggabungkan objek dengan objek JSON yang dikendalikan pengguna. Jika operasi penggabungan tidak membersihkan keys, itu juga dapat terjadi sebagai akibat dari objek yang dihasilkan dari parameter query/hash. Ini akan memungkinkan penyerang untuk menggunakan keys properti seperti __proto__ dan membuat penugasan sewenang-wenang ke Object.prototype (atau prototype global lainnya). Ketika ini terjadi, itu disebut source prototype poluttion. Kode contoh berikut mengilustrasikan hal ini.
params.replace(/\+/g, ' ').split('&').forEach(function(v){
var param = v.split( '=' ),
key = decodeURIComponent( param[0] ),
val,
cur = obj,
I = 0,
//…
obj[key]=val;
//…
let url = new URL(location);
let params = url.searchParams;
deparam(params.toString())
Untuk mengeksploitasi prototype poluttion, Anda memerlukan source dan gadget. Gadget prototype poluttion terjadi saat situs menggunakan properti dengan cara yang berbahaya tanpa pemfilteran. Misalnya, situs mungkin melakukan hal berikut:
let myObject = {};
if(myObject.html) {
document.getElementById('myElement').innerHTML = myObject.html;
}
Sepintas, mungkin tampak baik-baik saja di sini. Objek tidak berisi properti apa pun, tetapi mesin JavaScript mencari di Object.prototype dari properti "html" jika tidak ada di objek saat ini. Ini akan membuat prototype pollution gadget yang disebut "html". Mari kita lihat apa yang terjadi ketika kita mengubah Object.prototype.
<div id="myElement"></div>
<script>Object.prototype.html="<img src onerror=alert(1)>";</script>
<script>
let myObject = {};
if(myObject.html) {
document.getElementById('myElement').innerHTML = myObject.html;
}
</script>
Ini akan menggunakan properti Object.prototype.html alih-alih properti "html" dari objek "myObject". developers berasumsi bahwa properti semacam itu mengarah ke XSS karena berada di luar kendali pengguna.
Bagaimana cara menemukan source prototype pollution sisi Client ?
Jika Anda ingin DOM Invader menemukan source pollution untuk prototype Anda, Anda perlu mengaktifkan opsi pollution untuk prototype Anda.
Setelah menggeser switch ke mode on, jelajahi situs yang ingin Anda uji. Jika Anda ingin melihatnya beraksi, Anda dapat menggunakan salah satu kasus uji. DOM Invader menguji string queri, hash, dan objek JSON yang dikirim menggunakan pesan web dan meberikan report sukses.
Dalam hal ini, DOM Invader telah mendeteksi dua prototype source pollution yang terjadi di string query. Ini ditunjukkan dengan "in search". Anda dapat memeriksa sourcenya secara manual menggunakan tombol Uji atau mendeteksi gadget secara otomatis menggunakan tombol Pindai Gadget. Jika Anda memilih yang terakhir, DOM Invader akan membuka jendela baru dengan progress bar. Ketika pemindaian selesai, hasilnya akan ditampilkan di DOM yang diperluas.
Pada contoh di atas, DOM Invader telah mendeteksi sebuah gadget bernama "html". Ini pada akhirnya akan menjadi sink innerHTML. Anda akan melihat bahwa Anda melihat tombol hijau "Exploit". Ini akan menggabungkan source yang terdeteksi dengan gadget dan secara otomatis membuat eksploitasi prototype poluttion.
Jika Anda ingin mencoba DOMInvader dengan kerentanan CSPP nyata, sembunyikan di Gin & JuiceShop. Lihat apakah Anda dapat menyalahgunakannya!
Temukan prototype poluttion di Situs Dunia Nyata
Selama waktu itu, saya mengalami banyak masalah yang dapat diselesaikan dengan meningkatkan DOM Invader. Hal pertama yang terungkap dari pemindaian gadget adalah noise dari non-interesting sinks. Untuk mengatasi ini, kami memutuskan untuk hanya menampilkan sink yang menarik secara default. Jika Anda tidak puas dengan default, Anda dapat mengubah source/sink yang ditampilkan sesuai kebutuhan.
Saya ingin mengotomatiskan penemuan source pollution dalam prototype, tetapi cara terbaik untuk melakukannya adalah dengan menggunakan puppeteer. Tetapi apakah ada masalah dengan cara menghapus kerentanan dari DOM Invader? Anda juga dapat menggunakan puppeteer untuk melintasi DOM, seperti yang Anda lakukan dalam pengujian otomatis, tetapi itu lambat dan membosankan.
Jadi saya memutuskan untuk menambahkan callback ke DOMInvader. Callback memungkinkan Anda untuk mengeksekusi JavaScript ketika source, sink, atau pesan ditemukan. Ini membuatnya lebih mudah untuk mencatat kerentanan. Jika Anda membuka kembali konfigurasi seperti sebelumnya, Anda akan melihat bahwa setiap subtab memiliki tombol konfigurasi callback. callback ini memungkinkan Anda memanggil JavaScript khusus setiap kali item ditemukan dan meneruskan data yang tersedia ke callback.
Penggunaan callback ini sangat kuat. Anda dapat menggunakan navigator.sendBeacon atau mengambil untuk mengirim data ini ke titik akhir yang mencatat data. Jika Anda ingin DOM Invader menampilkan data, Anda dapat mengembalikan true atau false. Ini sangat berguna jika Anda memiliki situs yang noise dan ingin mengetahui data yang mengenai sink tertentu. callback dinonaktifkan secara default dan berwarna abu-abu. Edit callback dan klik Simpan untuk mengaktifkannya. Anda dapat menggunakan tombol reset untuk menonaktifkan fungsi callback dan mengembalikannya ke keadaan default.
Saya membuat callback source:
function(sourceDetails, sources) {
let data = JSON.stringify(sourceDetails);
let url = 'http://localhost:8000/log.php';
fetch(url, {__proto__:null, method: "post", keepalive: true, body: data});
return true;//return true to log source
}
Ini mengirim data ke skrip PHP yang mencatat data. Selanjutnya, saya mulai menguji gadget. Anda dapat memindai gadget satu per satu meskipun situs Anda tidak memiliki prototype source pollution yang diketahui. Untuk melakukan ini, Anda perlu mengganti mode dengan pengaturan prototype poluttion.
Anda akan melihat bahwa DOM Invader mencoba memilih setelan terbaik untuk pemindaian gadget (misalnya, header respons CSP akan dihapus). Anda dapat mengganti default ini jika diinginkan. Dengan menggunakan teknik ini, kami menemukan beberapa situs yang rentan terhadap prototype poluttion sisi klien, termasuk pembuat mobil terkenal, situs game terkenal, dan domain utama Wordpress.
Seperti biasa, James Kettle sangat membantu dalam mendesain DOM Invader dan memberikan saran yang bagus untuk berterima kasih kepada James atas tombol "Scan for gadgets". Terima kasih kepada Nolan Ward untuk pengeditan grafis dan video yang luar biasa. Ada beberapa penelitian bagus tentang prototype poluttion sisi klien dan saya sangat membantu. Terima kasih kepada Sergey Bobrov, Mohan Sri Rama Krishna P, Terjanq, Beomjin Lee, Masato Kinugawa, Nikita Stupin, Rahul Maini, Harsh Jaiswal, Mikhail Egorov, Meral Dev, Michael Bentkowski, Filedescriptor, Olivier, William Bowling, Ian Bouchard. Alat dan penelitian.
Dapatkan versi baru DOM Invader
Untuk mendapatkan versi baru DOM Invader, cukup perbarui versi Burp Suite Professional atau Burp Suite Community Edition ke 2022.6 di saluran Pengguna Awal untuk memulai.
sumber : https://portswigger.net/blog/finding-client-side-prototype-pollution-with-dom-invader