UEditor編輯器存儲型XSS漏洞挖掘
前言
UEditor是由百度web前端研發部開發的所見即所得富文本web編輯器,具有輕量,可定製,注重用戶體驗等特點。UEditor存在一個XSS漏洞,編輯器在定義過濾規則的時候不嚴和讀取內容的時候的繞過導致了該漏洞,目前此漏洞已經上報。
漏洞成因分析漏洞文件產生在前端配置文件ueditor.config.js:
以下爲純文本粘貼爲true時的過濾規則,對一些危險的標籤沒有做過濾,怪不得好多二次開發的。
//純文本粘貼模式下的過濾規則
//'filterTxtRules' : function{
// function transP(node){
// node.tagName = 'p';
// node.setStyle;
// }
// return {
// //直接刪除及其字節點內容
// '-' : 'script style object iframe embed input select',
// 'p': {$:{}},
// 'br':{$:{}},
// 'div':{'$':{}},
// 'li':{'$':{}},
// 'caption':transP,
// 'th':transP,
// 'tr':transP,
// 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP,
// 'td':function(node){
// //沒有內容的td直接刪掉
// var txt = !!node.innerText;
// if(txt){
// node.parentNode.insertAfter(UE.uNode.createText(' '),node);
// }
// node.parentNode.removeChild(node,node.innerText)
// }
// }
//}
如下圖,在官方文檔裏也進行了說明,通過getContent和setContent方法用
標籤讀取編輯器內容
#通getContent和setContent方法可以設置和讀取編輯器的內容
varue = UE.getEditor;//對編輯器的操作最好在編輯器ready之後再做ue.ready(function{
//設置編輯器的內容
ue.setContent('hello');
//獲取html內容,返回: <p>hello</p>
//獲取純文本內容,返回: hello
vartxt = ue.getContentTxt;});
HTML中的p標籤爲段落標籤,目前所有主流瀏覽器都支持
標籤。
從編輯器裏的左上角顯示html可以看出,是帶有
標籤的,所以在標籤內寫入payload是不被執行的
如下圖,在刪除掉
標籤後寫入payload可觸發XSS漏洞
如果沒有提交或者保存的功能,那麼無法與數據庫交互形成存儲XSS,但是依然可多次點擊左上角html按鈕觸發xss
漏洞利用
首先安裝部署環境:https://github.com/fex-team/ueditor/releases/tag/v1.4.3.3
存儲型XSS需要寫入後端數據庫,這裏要把編輯器部署到一個可與數據庫交互的環境中。
首先我們打開編輯器輸入正常的文本:
抓包並將
標籤以及原本的文本刪除
插入payload:
%3Cp%3E1111111"><ImG sRc=1 OnErRoR=prompt(1)>%3Cbr%2F%3E%3C%2Fp%3E
成功觸發存儲型XSS漏洞
經筆者調查在互聯網上存在着許多ueditor編輯器在線展示的網站,這些大都存在沒有與後端交互的反射型XSS,但是如果存在與後端數據庫交互的功能譬如一些寫作平臺即可形成存儲型XSS漏洞,結合一些xss平臺,或者再和其他漏洞配合形成組合拳,威力也不容小藐。
防禦措施1、修改 xss過濾白名單 配置文件ueditor.config.js,增加白名單過濾,比如對一些非法的參數和標籤,像 <>、,”,’,img標籤的onerror屬性,script標籤等進行自動轉義,或者是強制的攔截並提示。
2、對輸入的數據也進行html轉義,使其不會識別爲可執行腳本。