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

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](http://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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678102592489/4c7eb74c-b3c4-4696-aa8b-f838383d61ba.png align="center")

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`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678102767661/95054a89-a04a-457c-9d4f-5834e890fd4a.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678102434475/878e06ff-9e11-4afc-9a2e-a6b3dcf90e57.png align="center")

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/](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:
    
    ```csharp
     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
    
    ```csharp
    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")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678103428196/fab4e7d9-e867-4095-8e1c-716cfaafa2ce.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678103575363/f0c26e9b-30ae-4712-8085-8682a05a9d2a.png align="center")

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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678103884246/43a2ad66-9be3-4068-b1eb-2ed11c6c8c32.png align="center")

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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1678103970667/9bfdda87-8d21-43dc-af80-f1dbfad21c2e.png align="center")

Đế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:

%[https://www.youtube.com/watch?v=9eqge6SsAs4] 

# 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](https://dev.sitecore.net/Downloads/Sitecore%20Experience%20Platform/103/Sitecore%20Experience%20Platform%20103/Release%20Notes)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1679236426259/a80e2de6-5783-45db-b60a-7cb719f71c93.png align="center")

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.
