Về lỗ hổng trong thiết kế của sitecore

Về lỗ hổng trong thiết kế của sitecore

·

4 min read

Sitecore là một trong những hệ quản trị nội dung cấp độ doanh nghiệp xây dựng trên ASP.NET, giúp các nhà biên tập nội dung web và người làm marketing có toàn quyền điều kiển website của họ, từ việc tích hợp có tính xã hội các blog để tiến tới cá nhân hóa, thương mại. CMS là trái tim của website sitecore. Nhờ tận dụng được tính linh hoạt, đa người dùng và an toàn bảo mật của nền tảng .NET, Sitecore được sử dụng bởi những tổ chức hàng đầu như Experian, Toshiba, Canon and Nestlé, Microsoft .....

1. Bước đầu phát hiện lỗ hổng bảo mật

Thực hiện đọc mã nguồn sản phẩm của sitecore, rất dễ dàng để tìm thấy các chức năng có thể gây ra lỗ hổng bảo mật từ class DownloadPage tại sitecore/shell/download.aspx, mặc dù nó được thiết kế để sẽ không gây nguy hiểm khi chỉ sử dụng các dữ liệu nội bộ, không input trực tiếp từ client.

Hàm này có thể sử dụng ../ để download file tùy ý. Tuy nhiên để input trực tiếp filename thì cần phải là Administrator hoặc file name cần phải được lấy từ hàm FileHandle.GetFilename một cách hợp lệ (đoạn code được khoanh đỏ), đại khái filename cần tồn tại và được tham chiếu qua UrlHandle hoặc class ValidationResultPage

Thực hiện deserialize data mà không sử dụng Binder gây ra lỗ hổng thực thi mã tùy ý. Nhưng dữ liệu cũng cần được input từ UrlHandle.

2. Tìm hiểu cách UrlHandle hoạt động

Để hiểu tính năng UrlHandle mọi người có thể đọc tại đây https://sitecorejunkie.com/2012/11/09/get-a-handle-on-urlhandle/

Tóm tắt lại, Urlhandle nơi lưu trữ các dữ liệu được dùng nội bộ và không cho phép người dùng nhập trực tiếp. Dữ liệu sẽ được truy suất bằng id hoặc tên.

Ví dụ:

  1. Class page1 lưu string "88888" sử dụng cho các page khác:

      UrlHandle urlHandle = new UrlHandle();
      urlHandle["id"] = "88888"
    
  2. Sau đó, class page2 lấy string "88888" ra với query GET page2.aspx?hdl=id bằng cách

     UrlHandle urlHandle = UrlHandle.Get(); //(với handlename mặc định lấy từ request var name = "hdl")
     string id = urlHandle["id"]);
    

Đào sâu hơn vào source code của UrlHandle class, thấy được các giá trị của UrlHandle được lưu theo session. Chúng được lưu dưới dạng tham số string (theo ví dụ ở trên thì sẽ là "id=88888")

UrlString này sẽ được lưu vào HttpContext.Session như sau:

Lúc này key sẽ là handle name, value là string theo định dạng tên "biến = dữ liệu" ví dụ "id=88888"

3 Tận dụng tính năng của HttpContext.Session để giả mạo dữ liệu UrlHandle

Vấn đề ở đây là HttpContext.Session là một hệ thống lưu dữ liệu được nhiều đoạn code khác sử dụng. Chỉ cần một hàm lưu được string tùy ý vào HttpContext.Session thì ta hoàn toàn tạo được một UrlHandle giả tùy ý. Một function như vậy được tìm thấy trong Sitecore như sau:

Biến CurrentDevice được lưu theo HttpContext.Session với key SC_PAGEDESIGNER_CURRENTDEVICE. String này được input từ client, việc này chỉ cần tài khoản bất kỳ có quyền đăng nhập:

Đến đây ta đã có thể khai thác 2 đoạn code được bảo vệ bằng cách ngăn chặn client nhập trực tiếp dữ liệu ở class DownloadPâge hoặc ValidationResultPage

4. Khai thác lỗ hổng bảo mật trên Sitecore PageDesigner

Download file tùy ý (class DownloadPage)

  1. Gửi request đến /sitecore/shell/~/xaml/Sitecore.Shell.Applications.Layouts.PageDesigner.aspx với tham số &__PARAMETERS=pagedesigner:changedevice(device=file=../../web.config) để set key session SC_PAGEDESIGNER_CURRENTDEVICE = file=../../web.config

  2. Truy cập trang /sitecore/shell/download.aspx?file=SC_PAGEDESIGNER_CURRENTDEVICE để download file đã set trước đó với user bất kỳ không có quyền admin.

Insecuure Deserialization (class ValidationResultPage)

  1. Gửi request đến /sitecore/shell/~/xaml/Sitecore.Shell.Applications.Layouts.PageDesigner.aspx với tham số &__PARAMETERS=pagedesigner:changedevice(device=validators=BinaryFormatterPayload)

  2. Truy cập /sitecore/shell/~/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.ValidationResult.aspx?hdl=SC_PAGEDESIGNER_CURRENTDEVICE để kích hoạt việc desrialize mã khai thác.

Video PoC:

5. Lời kết

Các lỗ hổng này được sitecore ghi nhận với các mã lỗi sau:

  • Urlhandle: 525192 (Medium)

  • Download.aspx: 390129 (Medium)

  • ValidationResultPage.aspx: 525345 (Medium)

Và được fix trong release note: https://dev.sitecore.net/Downloads/Sitecore%20Experience%20Platform/103/Sitecore%20Experience%20Platform%20103/Release%20Notes

Tuy nhiên, cần lưu ý rằng tất cả ví dụ trên chỉ là các tính năng cơ bản của sitecore. Nếu có các chức năng được dev code lại thêm vào sitecore, chúng có thể gây ra nhiều lỗ hổng nghiêm trọng hơn.