Apakah Mengaktifkan Double Escaping Berbahaya?

136

Saya memiliki aplikasi ASP.NET MVC dengan rute yang memungkinkan pencarian barang melalui / search / <searchterm>.

Ketika saya menyediakan "search / abc" itu berfungsi dengan baik, tetapi ketika saya menyediakan "/ search / a + b + c" (dengan benar dikodekan url) maka IIS7 menolak permintaan dengan Kesalahan HTTP 404.11 ( Modul pemfilteran permintaan dikonfigurasi untuk menolak permintaan yang berisi urutan escape ganda ). Pertama-tama, mengapa ia melakukan ini? Tampaknya hanya membuang kesalahan jika itu adalah bagian dari URL, tetapi bukan sebagai bagian dari string kueri (/ transmit? Q = a + b + c berfungsi dengan baik).

Sekarang saya dapat mengaktifkan permintaan pelolosan ganda di bagian keamanan web.config saya tetapi saya ragu untuk melakukannya karena saya tidak memahami implikasinya, dan juga mengapa server menolak permintaan "a + b + c" sebagai bagian dari URL tetapi terima sebagai bagian dari string kueri.

Adakah yang bisa menjelaskan dan memberi nasihat apa yang harus dilakukan?

Alex
sumber
7
Saya juga mencoba opsi yang mungkin lebih tepat untuk memanggil Server.Url Path Encode dan berakhir dengan /search/a%2520b%2520cmark-up yang mengarah ke kesalahan "A berpotensi berbahaya Request.Path nilai terdeteksi dari klien (%)". Sepertinya Anda tidak bisa menang.
Zhaph - Ben Duguid

Jawaban:

159

Edit: Menambahkan penekanan ke bagian yang relevan.

Pada dasarnya: IIS terlalu paranoid. Anda dapat dengan aman menonaktifkan pemeriksaan ini jika Anda tidak melakukan sesuatu yang sangat tidak bijaksana dengan data uri yang didekodekan (seperti membuat URI sistem file lokal melalui penggabungan string).

Untuk menonaktifkan pemeriksaan, lakukan hal berikut (dari sini ): (lihat komentar saya di bawah untuk mengetahui apa yang diperlukan pelolosan ganda).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Jika simbol plus adalah karakter yang valid dalam input pencarian, Anda harus mengaktifkan "allowDoubleEscaping" untuk mengizinkan IIS memproses input tersebut dari jalur URI.

Akhirnya, solusi yang sangat sederhana, jika terbatas adalah dengan menghindari '+' dan sebagai gantinya gunakan '% 20'. Bagaimanapun, menggunakan simbol '+' untuk menyandikan spasi bukanlah pengkodean url yang valid , tetapi spesifik untuk sekumpulan protokol terbatas dan mungkin didukung secara luas untuk alasan kompatibilitas mundur. Jika hanya untuk tujuan kanonikalisasi, Anda lebih baik mengenkode spasi sebagai '% 20'; dan ini menghindari masalah IIS7 (yang masih dapat muncul untuk urutan lain, seperti% 25ab.)

Eamon Nerbonne
sumber
3
Saya akan menonaktifkan cek. Ini merepotkan dan tidak memberikan keamanan ekstra untuk sebagian besar aplikasi.
Eamon Nerbonne
3
Apakah Anda memiliki link / referensi yang cukup aman untuk menonaktifkan pelolosan ganda? Selain itu, apa sebenarnya yang dicegah oleh tindakan keamanan ini?
Alex
15
Jika sebuah uri di-escape ganda, maka komponen uri yang tidak lolos mungkin sendiri berisi karakter yang dicadangkan dan dengan demikian (bagian dari) uri yang tidak lolos itu sendiri bisa menjadi uri yang valid. Singkatnya, jika Anda menggunakan string uri yang tidak lolos untuk membuat uri baru - di jalur sistem file tertentu - dan Anda gagal untuk keluar dengan benar dari jalur baru, Anda dapat mengizinkan injeksi jalur. Injeksi jalur dapat memungkinkan penyerang untuk mengelabui program Anda agar memproses data yang seharusnya tidak, atau membingungkannya sehingga berpikir dua uri berbeda ketika keduanya sebenarnya identik tetapi hanya dikodekan secara berbeda.
Eamon Nerbonne
4
@Stijn: Ya: aman . Semua pemeriksaan ini dilakukan untuk memfilter permintaan yang mungkin disalahartikan oleh kode buggy (khususnya jika Anda mendekode ganda atau membangun Uri melalui string-concat dan tanpa pengkodean yang tepat). Anda tidak sedang melakukan pemrosesan apa pun, jadi itu secara otomatis aman di pihak Anda. Bug apa pun harus ada dalam kode penyajian file dasar IIS, dan saya pikir kita dapat dengan aman berasumsi bahwa itu sudah sangat, sangat menyeluruh diuji pertempuran sekarang. Sekali lagi, pemeriksaan ini tidak mewah, hanya menjamin hal-hal yang mungkin diterjemahkan dan kemudian terlihat seperti uri yang dikodekan .
Eamon Nerbonne
2

Saya hanya ingin menambahkan beberapa informasi ke jawaban Eamon Nerbonne yang terkait dengan bagian " apa yang harus dilakukan " dari pertanyaan Anda (tidak menjelaskan mengapa).
Anda juga dapat dengan mudah mengubah pengaturan aplikasi tertentu dengan

  1. membuka konsol dengan hak admin (Mulai - cmd - klik kanan, Jalankan sebagai administrator)
  2. mengetik berikut ini (diambil dari sini: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
    

    (Anda dapat mengganti YOURSITENAMEdengan Default Web Sitemenerapkan aturan ini ke situs web default)

  3. Masuk, siap.

Sebuah contoh:

  1. pertama saya memiliki masalah yang sama: Kesalahan HTTP 404.11 - Modul pemfilteran permintaan dikonfigurasi untuk menolak permintaan yang berisi urutan pelolosan ganda.
  2. Mengetik teks yang disebutkan di atas: Drupal7-lainnya Solusi untuk Kesalahan HTTP 404.11 - Modul pemfilteran permintaan dikonfigurasi untuk menolak permintaan yang berisi urutan pelolosan ganda.
  3. Sekarang berfungsi seperti yang diharapkan: Solusi untuk Kesalahan HTTP 404.11 - Modul pemfilteran permintaan dikonfigurasi untuk menolak permintaan yang berisi urutan pelolosan ganda.
Sk8erPeter
sumber
1

Pernahkah Anda berpikir untuk memiliki URL pencarian seperti '/ search / a / b / c'?

Anda perlu menyiapkan rute seperti

search/{*path}

Dan kemudian ekstrak nilai pencarian dari string jalur Anda dalam tindakan.

HTH
Charles

Charlino
sumber
Masalahnya adalah karakter yang dikodekan URL lainnya (termasuk '/' itu sendiri) dapat menjadi bagian dari pencarian.
Alex
Bisakah Anda tidak menyandikan semua '/' yang sebenarnya adalah bagian dari pencarian ke '% 2F'?
Charlino
0

Saya mengalami ini di bawah IIS 7.5 melakukan Server.TransferRequest () dalam aplikasi.

Mengkodekan nama file menyebabkan masalah pelarian ganda, tetapi jika saya tidak menyandikannya maka saya akan mengalami kesalahan "Request.Path yang berpotensi berbahaya" .

Menempatkan protokol apa pun, bahkan yang kosong, di URL yang saya berikan ke Server.TranferRequest () memperbaiki masalah.

Tidak bekerja:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Pekerjaan:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
mhenry1384
sumber