作者:k1n9 & RickyHao@360CERT

0x00 背景介紹

DNN uses web cookies to identify users. A malicioususer can decode one of such cookies and identify who that user is, and possiblyimpersonate other users and even upload malicious code to the server.

--DNNsecurity-center

2017年7月5日,DNN 安全板塊發布了一個編號 CVE-2017-9822 的嚴重漏洞,隨后漏洞報告者 Alvaro Mu?oz (@pwntester) 和 OleksandrMirosh 在 BlackHat USA 2017 上披露了其中的一些細節。

360CERT 跟進分析了該漏洞及其在 .net 中使用 XmlSerializer 進行序列化/反序列化的攻擊利用場景,確認為嚴重漏洞。

0x01 漏洞概述

DNNPersonalization 是一個在 DNN 中是用于存放未登錄用戶的個人數據的 Cookie,該 Cookie 可以被攻擊者修改從而實現對服務器任意文件上傳,遠程代碼執行等攻擊。

0x02 漏洞攻擊面影響

1.影響面

漏洞等級: 嚴重

據稱,全球有超過 75 萬的用戶在使用 DNN 來搭建他們的網站,影響范圍大。

2.影響版本

從 5.0.0 到 9.1.0 的所有版本

3.修復版本

DNN Platform 9.1.1 和 EVOQ 9.1.1

0x03 漏洞詳情

1、漏洞代碼

PersonalizationController.cs66-72 行:

從 Cookie 中獲取到 DNNPersonalization 的值后再傳給 Globals 中的 DeserializeHashTableXml 方法。

Globals.cs 3687-3690 行:

再跟進 XmlUtils 中的 DeSerializeHashtable 方法。

XmlUtils.cs 184-218 行:

該方法會使用 item 元素中的 type 屬性值來設置類型,并且會在 208 行這里將該元素的內容進行反序列化,這里便是漏洞的觸發點了。漏洞代碼中從可控輸入點到最終可利用處的這個過程還是比較直觀的,接下來是針對像這樣使用了 XmlSerializer 來反序列化的漏洞點進行攻擊利用分析。

0x04 攻擊利用分析

1、XmlSerializer 的使用

在對一個類進行序列化或者反序列化的時候都需要傳入該類的類型信息。看下生成的序列化數據形式:

就是一個 XML 文檔,類名和成員變量都是元素來表示。

2、利用鏈的構造

修改下上面的 TestClass 類,對其中的成員變量 test 進行封裝。

這時候再去觀察代碼在反序列化時的輸出,可以明顯知道 setter 被自動調用了,因此 setter 便可以作為利用鏈的第一步。接下來就是要去找一些可以被用作攻擊使用的類了。

System.Windows.Data.ObjectDataProvider 可以調用任意在運行時被引用的類的任意方法。一個例子:

相當于調用了 TestClass.FuncExample(“JustATest!”),ObjectDataProvider 中的成員變量都進行了封裝的,并且每次調用了 setter 后都會檢測參數是否足夠,足夠了的話便會自動去調用傳入的方法。其中的過程借用 BlackHat 議題中的一張圖來展示。

如此一來要是被序列化的是一個 ObjectDataProvider 類,那么在反序列的時候便可以做到任意方法調用的效果。再找一個存在能達到想要的利用效果的方法的類就行了,例如 DNN 中的就存在一個可以做到任意文件上傳效果的類,DotNetNuke.Common.Utilities.FileSystemUtils 中的 PullFile 方法:

3、Payload生成

要生成 payload 還有一點問題需要解決,就是 ObjectDataProvider 包含一個 System.Object 成員變量(objectInstance),執行的時候 XmlSerializer 不知道這個變量具體的類型,導致沒法序列化。但是這個問題可以通過使用 ExpandedWrapper 擴展屬性的類型來解決。

生成的內容如下:

DNN 是通過獲取 item 的屬性 type 的值,然后調用 Type.GetType 來得到序列化數據的類型再進行反序列化。這樣的話需要加上相應的程序集的名稱才行,可以通過下面的代碼得到 type 的值:

結合DNN的代碼生成最終的Payload:

0x05 漏洞利用驗證

將漏洞觸發點所在 DeSerializeHashtable 函數放到本地來做一個漏洞利用驗證。

再看服務器端,可以看到漏洞利用成功。

0x06 修復建議

360CERT建議升級到最新的版本DNNPlatform 9.1.1或者EVOQ 9.1.1。

0x07 時間軸

2017-7-5 官方發布安全公告并提供修復更新 2017-8-2 360CERT完成對漏洞的分析并形成報告

0x08 參考文檔

https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/365/