1. 程式人生 > >利用HTML5的CORS特性繞過httpOnly的限制實現XSS會話劫持

利用HTML5的CORS特性繞過httpOnly的限制實現XSS會話劫持

0×00. 前言 

有時候我們遇到一個儲存型XSS 漏洞,但是sessionId設定了httpOnly,劫持不了會話,顯得很雞肋,讓滲透測試人員很蛋疼,不過這種情況正在好轉,隨著HTML5的流行,通過HTML5 的CORS功能實現跨域通訊,建立HTTP tunnel通訊,實現會話劫持已經變成可能,本文就通過實測驗證HTML5的CORS條件下的xss會話劫持的可行性。

0×01. 前提條件

1)有一個存在XSS 漏洞的站點(最好是儲存型的)

2)站點cookie使用了httpOnly

3)客戶端瀏覽器支援HTML5 (因為使用者端【被控端】和控制端需要通過HTML CORS 跨域通訊,建立http通道)

0×02. 本次實驗環境

漏洞環境:

1.修改後的dvwa (修改預設security level 修改為high,且high level下設定了httpOnly標誌)

使用到的工具: 

2.使用者端瀏覽器使用chrome

3. Shell of the Future_v0.9

Shell of the Future 監聽8080 和1337埠,8080 為對外公開,提供惡意js下載、建立http 通道

1337 監聽在本地,用來管理被劫持的會話

選擇Server + Proxy 模式,點選start 即可

4. burpsuite 1.7

執行在客戶端(就是在虛擬機器中,使用者端訪問含有XSS漏洞的站點時通過burpsuite代理訪問,這樣會捕獲使用者的訪問,觀察會話劫持的過程)

5.Vmware WorkStation

虛擬機器,充當使用者端 (192.168.3.206)

虛擬機器充當使用者訪問裝置 ,宿主機充當以下角色

1)dvwa 所在伺服器(充當含有XSS漏洞的站點)192.168.2.85www.xss.net

2)xss漏洞觸發時下載js所在伺服器(即Shell of the Future所在伺服器)192.168.2.85www.attacker.net

登入Shell of Future 管理後臺的瀏覽器做以下設定:

然後位址列輸入 http://localhost/sotf.console,當看到如下介面時,說明shell of the future 和管理後臺的瀏覽器設定OK

0×03. 測試過程

1) 事先插入一段xss程式碼

修改dvwa 資料庫下的guestbook表的comment欄位大小為800(不然長度不夠嘿嘿)

然後插入一段xss 程式碼

2) 配置好使用者端的hosts

3)開始測試

使用者端開啟含有xss漏洞的站

恩,確認cookie設定了httpOnly標識

開啟含有xss程式碼的頁面,觸發xss漏洞, OK, 通過截包,我們看看發生了什麼

Ok,我們看到惡意js載入執行後就開始利用HTML CORS 特性跨域向控制端poll請求(poll 8080 埠,相當於在8080 建立了一條http 通道)

控制端接收到HTML CORS 請求後,從origin中獲取被劫持會話的地址 (控制端就是HTML CORS的 server端)

然後。 控制端就給使用者端分配一個 ID ,用於標識被劫持的sessionID, 從1開始,

使用者端poll指令的時候攜帶上sessionID編號,控制端就知道要處理的是哪一個被劫持的session。

當hacker 在控制端點選被劫持的session的時候,控制端(1337埠)截獲了此點選(確定是GET 請求還是POST請求,有木有攜帶引數),處理之後轉發給8080埠的服務,然後通過8080的http 通道向用戶(被控端)傳送指令

當hacker 點選被劫持的session的host的時候(比如上圖的www.xss.net),就相當於向用戶端傳送了GET http://www.xss.net指令

使用者端poll到指令之後,就開始執行了

上圖指令是被hex加密之後的,16進位制的分隔符是x,解碼之後就是指令內容

其中m 表示請求方法,u表示請求的url,b表示請求引數,ct表示額外的請求頭部,ssl表示是否加密,rid表示第幾次請求

使用者端執行完指令之後將指令執行結果內容push到控制端(利用HTML CORS特性跨域push)

注意到push的請求了嗎, 1_1 表示第一個劫持會話的第一次請求, push的內容是www.xss.net首頁內容,內容格式

請求編號&請求響應碼&響應頭部內容&響應body

請求編號表示第幾次請求,響應頭部和響應body 都經過16進位制編碼,16進位制的分隔符是x

控制端接收到使用者端的push之後,hex解碼展現給使用者

此後hacker在控制檯點選被劫持會話頁面的每個動作都被1337埠截獲,1337埠監聽的服務處理後將向用戶端傳送指令(這就是為什麼設定代理的原理,傳送指令是通過已建立的8080 埠 http 通道)

然後等待指令執行結果,然後展現給控制檯,這就實現了會話劫持!

0×04. shell of the future 劫持會話原理圖

0×05. 不足

使用者端如果離開含有xss程式碼的頁面的時候,則建立的http 通道斷開連線 (e1.js 不會再執行,客戶端不會輪詢控制端指令,控制端沒法下發指令)。