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ụ:
Class
page1
lưu string "88888" sử dụng cho các page khác:UrlHandle urlHandle = new UrlHandle(); urlHandle["id"] = "88888"
Sau đó, class
page2
lấy string "88888" ra với queryGET page2.aspx?hdl=id
bằng cáchUrlHandle 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
)
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 sessionSC_PAGEDESIGNER_CURRENTDEVICE
=file=../../web.config
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
)
Gửi request đến
/sitecore/shell/~/xaml/Sitecore.Shell.Applications.Layouts.PageDesigner.aspx
với tham số&__PARAMETERS=pagedesigner:changedevice(device=validators=BinaryFormatterPayload)
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.