it-swarm-id.com

Eksploitasi karakter multibyte - PHP / MySQL

Bisakah seseorang tunjukkan saya ke tautan dengan beberapa informasi tentang eksploitasi karakter multibyte untuk MySQL? Seorang teman membawa mereka ke perhatian saya, tetapi saya tidak dapat menemukan banyak informasi di Internet.

20
Matthew S

Ringkasan. Ya, masalahnya adalah bahwa, dalam beberapa pengkodean karakter (seperti UTF-8), satu karakter direpresentasikan sebagai beberapa byte. Salah satu cara beberapa pemrogram mencoba mencegah injeksi SQL adalah dengan melepaskan semua tanda kutip tunggal dalam input yang tidak tepercaya, sebelum memasukkannya ke dalam kueri SQL mereka. Namun, banyak fungsi pelolosan-kutipan standar tidak mengetahui pengkodean karakter yang akan digunakan oleh database dan memproses input mereka sebagai urutan byte, tidak menyadari fakta bahwa satu karakter mungkin mengisi beberapa byte. Ini berarti bahwa fungsi quote-escape adalah menafsirkan string secara berbeda dari yang akan dilakukan oleh database. Akibatnya, ada beberapa kasus di mana fungsi pelolosan-kutipan mungkin gagal lolos dari bagian-bagian string yang akan ditafsirkan oleh basis data sebagai pengkodean multi-byte dari kutipan tunggal; atau mungkin secara tidak sengaja memecah pengkodean karakter multi-byte dengan cara yang memperkenalkan kutipan tunggal di mana seseorang sebelumnya tidak ada. Dengan demikian, eksploitasi karakter multi-byte memberi penyerang cara untuk melakukan serangan injeksi SQL bahkan ketika programmer berpikir bahwa mereka cukup melarikan diri input mereka ke database.

Dampaknya. Jika Anda menggunakan pernyataan disiapkan/parametrized untuk membentuk semua koneksi database, Anda aman. Serangan multi-byte akan gagal. (Cegah bug di database dan perpustakaan, tentu saja. Tapi secara empiris, itu tampaknya jarang terjadi.)

Namun, jika Anda mencoba melarikan diri dari input yang tidak dipercaya dan kemudian membentuk kueri SQL secara dinamis menggunakan penggabungan string, Anda mungkin rentan terhadap serangan multi-byte. Apakah Anda sebenarnya rentan tergantung pada detail spesifik dari fungsi pelarian yang Anda gunakan, database yang Anda gunakan, pengkodean karakter yang Anda gunakan dengan database, dan mungkin faktor-faktor lain. Sulit untuk memprediksi apakah serangan multi-byte akan berhasil. Akibatnya, membentuk kueri SQL menggunakan penggabungan string rapuh dan tidak disarankan.

Detail teknis. Jika Anda ingin membaca tentang rincian serangan, saya dapat memberi Anda sejumlah tautan yang menjelaskan serangan dengan hebat. detail. Ada beberapa serangan:

  • Serangan dasar pada, mis., UTF-8 dan pengkodean karakter lainnya dengan memakan backslash/tanda kutip tambahan yang diperkenalkan oleh fungsi mengutip: lihat, mis., di sini .

  • Serangan licik pada, misalnya, GBK, yang bekerja dengan menipu fungsi kutipan untuk memperkenalkan kutipan tambahan untuk Anda: lihat, misalnya, blog Chris Shiflett , di sini , atau - di sini .

  • Serangan pada, mis., UTF-8, yang menyembunyikan keberadaan kutipan dengan menggunakan penyandian non-kanonik (terlalu panjang) yang tidak valid dari kutipan tunggal: see, mis., di sini . Pada dasarnya, cara normal penyandian suatu kutipan tunggal telah memasukkannya ke dalam urutan byte tunggal (yaitu, 0x27). Namun, ada juga urutan multi-byte yang dapat diterjemahkan oleh basis data sebagai kutipan tunggal, dan yang tidak mengandung 0x27 byte atau nilai byte mencurigakan lainnya. Akibatnya, fungsi pelolosan-kutipan standar mungkin gagal lolos dari kutipan-kutipan itu.

20
D.W.

Serangan mutli-byte tidak terbatas pada SQL Injection. Dalam arti umum serangan multi-byte mengarah ke kondisi "konsumsi byte" di mana penyerang menghapus karakter kontrol. Ini adalah kebalikan dari klasik ' or 1=1--, Di mana penyerang memperkenalkan karakter kontrol kutipan tunggal. Untuk mysql ada mysql_real_escape_string() yang dirancang untuk menangani masalah pengkodean karakter. Pustaka permintaan parametrized seperti PDO akan secara otomatis menggunakan fungsi ini. MySQLi sebenarnya mengirimkan parameter kueri sebagai elemen terpisah dalam sebuah struct, yang menghindari masalah sepenuhnya.

Jika halaman HTML diberikan melalui Shift-JIS maka dimungkinkan untuk menggunakan karakter kontrol untuk mendapatkan XSS. Contoh yang sangat baik dari ini disediakan di " A Tangled Web " (buku fantastis!) Di halaman 207:

<img src="http://fuzzybunnies.com/[0xE0]">
...this is still a part of the mkarup...
...but the srever dosn't know...
" onload="alert('this will execute!')"
<div>
...page content continues...
</div>

Dalam hal ini 0xE0 adalah byte khusus yang menandakan mulai dari simbol 3 byte. Ketika browser membuat html ini, "> Yang mengalir akan dikonsumsi dan diubah menjadi simbol Shift-JIS tunggal. Jika penyerang mengontrol input berikut dengan variabel lain, maka ia dapat memperkenalkan pengendali event untuk mendapatkan eksekusi kode.

5
rook