Kerentanan Cemerlang dan Dimana Menemukan Mereka (Bahagian 1) - Skrip Cross-tapak dengan kesalahan bentuk Django

Kelemahan skrip XSS

Mengapa Scripting Cross-Site (XSS) masih kelemahan web yang paling umum? Teori mengenal pasti XSS agak mudah, terdapat banyak alat analisis statik yang dibuat untuk mengesannya dan masih terdapat banyak kelemahan yang belum ditemui. Jadi, apa yang memberi?

Nah, salah satu sebabnya ialah kaedah analisis program tradisional sering gagal untuk mengenal pasti maksud sekeping kod yang diberikan. Sebagai contoh, alat mungkin perjuangan dengan memikirkan objek yang ada dalam program itu boleh mengandungi input pengguna.

Di dalam jawatan saya sebelum ini, saya menerangkan bagaimana kita menangani masalah ini dengan membina sistem yang mempelajari spesifikasi keselamatan daripada ribuan projek Sumber Terbuka dan menggunakannya untuk mencari kelemahan sebenar. Saya juga berjanji untuk berkongsi beberapa contoh tentang apa yang dipelajari.

Saya memutuskan untuk memulakan dengan sumber isu-isu yang mungkin dan agak tidak dijangka dalam projek-projek yang menggunakan Django. Jawatan ini adalah panduan untuk mengenal pasti dan mengeksploitasi kelemahan XSS menggunakan kesilapan pengesahan dalam bentuk Django. Berikut adalah contoh sebenar: https://github.com/mozilla/pontoon/pull/1175.

Mari lompat ke dalamnya dan mulakan dengan kuiz kecil. Berapa kali anda menulis atau melihat kod yang serupa dengan cuplikan berikut?

Bagaimana dengan yang ini?

Atau yang ini?

Kesemuanya adalah contoh yang meluas tentang bagaimana anda biasanya membiarkan pengguna mengetahui bahawa input yang diberikan tidak sah, bukan? Input diambil dari parameter permintaan HTTP dan kemasukan ke dalam objek MyForm dengan kemas. Jika mana-mana medan mengandungi input yang tidak sah (mis. Seseorang memasuki rentetan "foobar" ke dalam medan angka), kemudian halaman 400 Permintaan Buruk akan dikembalikan dengan keterangan ralat. Perbezaan antara coretan adalah format ralat yang dikembalikan - senarai HTML, teks biasa atau JSON.

Sekarang satu juta dolar soalan - yang mana coretan ini akan menjadikan aplikasi web anda XSSable?

Untuk menjawabnya, mari kita siasat API bentuk Django dari dua pandangan:

  1. Adakah penyerang dapat menyuntik input berniat jahat ke halaman web yang dipaparkan dalam penyemak imbas pengguna?
  2. Adakah input yang berniat jahat ini dapat melarikan diri dengan betul sebelum ia dikembalikan kepada pengguna?

Menurut dokumentasi Django, cara untuk membina mesej ralat dinamik untuk kesalahan pengesahan lapangan adalah untuk menaikkan pengecualian django.core.exceptions.ValidationError dengan mesej yang bersamaan. Pengecualian seperti yang dibuang dari mana-mana fungsi pengesahan borang (misalnya kaedah bersih () dan clean_ () kelas django.forms.BaseForm) akan menyebabkan mesej disimpan dalam kamus ralat bentuk (django .forms.utils.ErrorDict) dan kemudiannya mungkin ditunjukkan kepada pengguna.

Salah satu cara untuk mengeksploitasi pengecualian semacam itu adalah dengan menggunakan beberapa medan bentuk terbina dalam yang dengan mudah mencerminkan input yang rosak ke dalam mesej pengecualian. Saya mencuba semua jenis medan borang Django yang disenaraikan di sini dan mendapat senarai berikut: ChoiceField, TypedChoiceField, MultipleChoiceField, FilePathField. Semua ini menghasilkan mesej ralat seperti "Pilih pilihan yang sah.% (Nilai) s bukan salah satu pilihan yang tersedia.", Di mana nilai adalah input yang rosak.