實戰|從XSS到遠程代碼執行
Opera瀏覽器有一個功能是My Flow,作用是計算機和手機之間的進行圖片、視頻、文件等共享。要連接到手機,只需掃描二維碼,然后就可以在設備之間發送東西。

使用 Opera 中的開發人員工具,發現 My Flow 界面是從域web.flow.opera.com加載的,它只是一個普通的 HTML 頁面,允許查看其源代碼。
查看頁面的源代碼,發現該頁面與瀏覽器擴展程序通信,但從瀏覽器擴展列表中的opera://extensions/ 中,什么也沒有出現。經過一番研究,發現它實際上是一個隱藏的瀏覽器擴展,可以通過使用特殊標志–show-component-extension-options打開 Opera 來顯示。打開帶有該標志后,找到了名為Opera Touch Background的擴展程序,并且能夠查看其源代碼。
回到 web.flow.opera.com 頁面,開始尋找 XSS 漏洞。引起我注意的是這段代碼:
const html = e.dataTransfer.getData('text/html');
const src = html.match(//);
if (src && src[1]) {
const parser = document.createElement("span");
parser.innerHTML = src[1];}
此功能用于拖放,當用戶將圖像拖放到頁面上時,代碼會創建一個元素,并將其innerHTML 元素設置為圖像的位置。但是,這樣做有兩個問題:
1、在瀏覽器中,可以將 dataTransfer 設置為任意值。
2、在瀏覽器中,如果你創建一個新元素并將其 innerHTML 設置為 標簽,它仍然會在后臺加載。
這意味著盡管屏幕上沒有加載圖像,但以下內容將導致一個警告框:
const parser = document.createElement("span");
parser.innerHTML = '<1img src=x onerror=alert(1)>';
考慮到所有這些,開始驗證是否存在XSS。為了展示引起 XSS 是多么容易,我創建了一個網頁,一旦你開始拖動圖片,幾秒鐘后就會重定向到 web.flow.opera.com 頁面。這意味著用戶只需要開始拖動圖片,然后簡單地松開鼠標,XSS 就會發生。

然而,為了驗證存在更大的影響,開始研究 Opera Touch Background 擴展實際上做了什么。事實證明,它具有更高的權限和訪問本機函數的權限,例如opr.operaTouchPrivate,它是為與 My Flow 應用程序一起使用而開發的函數集合。查看可用函數,有兩種情況引起了我的注意:SEND_FILE和OPEN_FILE。
SEND_FILE 函數檢索有關用戶提供的文件的信息并將其上傳到 My Flow;它還將文件保存到用戶計算機的Downloads/MyFlow 中。OPEN_FILE 用于 My Flow 的圖片文件,但在測試時我注意到你可以打開任何類型的文件,而不僅僅是圖片。
有了這兩個功能,我們現在可以在目標計算機上寫入和打開任意文件。為了創建一個真實的場景,首先創建一個包含calc的文件exploit.bat,然后打開該文件——這將導致它被執行,打開Windows計算器:
operaTouchBackground.port.postMessage({
type: "SEND_FILE",
name: 'exploit.bat',
content: 'calc',
file_type: 'image/png'
});
operaTouchBackground.port.postMessage({
type: 'OPEN_FILE',
localFileName: 'exploit.bat'
});
最后,通過單擊(拖動)激活漏洞所需的用戶界面,我演示了如何將簡單的 XSS 轉換為 My Flow 系統用戶的遠程代碼執行。
此漏洞已修復,并獲得了8000$。