跨域資源共享(CORS)

一、背景

提起瀏覽器的同源策略,大家都很熟悉绿店。不同域的客戶端腳本不能讀寫對方的資源锌介。但是實踐中有一些場景需要跨域的讀寫,所以出現(xiàn)了一些hack的方式來跨域锥咸。比如在同域內(nèi)做一個代理,JSON-P等。但這些方式都存在缺陷夜焦,無法完美的實現(xiàn)跨域讀寫。所以在XMLHttpRequest v2標準下岂贩,提出了CORS(Cross Origin Resourse-Sharing)的模型茫经,試圖提供安全方便的跨域讀寫資源。目前主流瀏覽器均支持CORS萎津。

二卸伞、技術(shù)原理

CORS定義了兩種跨域請求,簡單跨域請求和非簡單跨域請求锉屈。當一個跨域請求發(fā)送簡單跨域請求包括:請求方法為HEAD荤傲,GET,POST;請求頭只有4個字段部念,Accept弃酌,Accept-Language氨菇,Content-Language,Last-Event-ID;如果設(shè)置了Content-Type妓湘,則其值只能是application/x-www-form-urlencoded,multipart/form-data,text/plain查蓉。說起來比較別扭,簡單的意思就是設(shè)置了一個白名單榜贴,符合這個條件的才是簡單請求豌研。其他不符合的都是非簡單請求。

Paste_Image.png

之所以有這個分類是因為瀏覽器對簡單請求和非簡單請求的處理機制是不一樣的唬党。當我們需要發(fā)送一個跨域請求的時候鹃共,瀏覽器會首先檢查這個請求,如果它符合上面所述的簡單跨域請求驶拱,瀏覽器就會立刻發(fā)送這個請求霜浴。如果瀏覽器檢查之后發(fā)現(xiàn)這是一個非簡單請求,比如請求頭含有X-Forwarded-For字段蓝纲。這時候瀏覽器不會馬上發(fā)送這個請求阴孟,而是有一個preflight,跟服務器驗證的過程税迷。瀏覽器先發(fā)送一個options方法的預檢請求永丝。下圖是一個示例。如果預檢通過箭养,則發(fā)送這個請求慕嚷,否則就不拒絕發(fā)送這個跨域請求。

Paste_Image.png

下面詳細分析一下實現(xiàn)安全跨域請求的控制方式毕泌。

先看一下非簡單請求的預檢過程喝检。瀏覽器先發(fā)送一個options方法的請求。帶有如下字段:

  • Origin: 普通的HTTP請求也會帶有懈词,在CORS中專門作為Origin信息供后端比對,表明來源域蛇耀。

  • Access-Control-Request-Method: 接下來請求的方法,例如PUT, DELETE等等

  • Access-Control-Request-Headers: 自定義的頭部坎弯,所有用setRequestHeader方法設(shè)置的頭部都將會以逗號隔開的形式包含在這個頭中

然后如果服務器配置了cors,會返回對應對的字段译暂,具體字段含義在返回結(jié)果是一并解釋抠忘。

  • Access-Control-Allow-Origin:

  • Access-Control-Allow-Methods:

  • Access-Control-Allow-Headers:

然后瀏覽器再根據(jù)服務器的返回值判斷是否發(fā)送非簡單請求。簡單請求前面講過是直接發(fā)送外永,只是多加一個origin字段表明跨域請求的來源崎脉。然后服務器處理完請求之后,會再返回結(jié)果中加上如下控制字段:

  • Access-Control-Allow-Origin: 允許跨域訪問的域伯顶,可以是一個域的列表囚灼,也可以是通配符"*"骆膝。這里要注意Origin規(guī)則只對域名有效,并不會對子目錄有效灶体。即http://foo.example/subdir/ 是無效的阅签。但是不同子域名需要分開設(shè)置,這里的規(guī)則可以參照同源策略

  • Access-Control-Allow-Credentials: 是否允許請求帶有驗證信息蝎抽,這部分將會在下面詳細解釋

  • Access-Control-Expose-Headers: 允許腳本訪問的返回頭政钟,請求成功后,腳本可以在XMLHttpRequest中訪問這些頭的信息(貌似webkit沒有實現(xiàn)這個)

  • Access-Control-Max-Age: 緩存此次請求的秒數(shù)樟结。在這個時間范圍內(nèi)养交,所有同類型的請求都將不再發(fā)送預檢請求而是直接使用此次返回的頭作為判斷依據(jù),非常有用瓢宦,大幅優(yōu)化請求次數(shù)

  • Access-Control-Allow-Methods: 允許使用的請求方法碎连,以逗號隔開

  • Access-Control-Allow-Headers: 允許自定義的頭部,以逗號隔開驮履,大小寫不敏感

然后瀏覽器通過返回結(jié)果的這些控制字段來決定是將結(jié)果開放給客戶端腳本讀取還是屏蔽掉破花。如果服務器沒有配置cors,返回結(jié)果沒有控制字段疲吸,瀏覽器會屏蔽腳本對返回信息的讀取座每。

三、安全隱患

大家注意這個流程摘悴。服務器接收到跨域請求的時候峭梳,并沒有先驗證,而是先處理了請求蹂喻。所以從某種程度上來說葱椭。在支持cors的瀏覽器上實現(xiàn)跨域的寫資源,打破了傳統(tǒng)同源策略下不能跨域讀寫資源口四。

再一個就是如果程序猿偷懶將Access-Control-Allow-Origin設(shè)置為允許來自所有域的跨域請求孵运。那么cors的安全機制幾乎就無效了。不過先別高興的太早蔓彩。其實這里在設(shè)計的時候有一個很好的限制治笨。xmlhttprequest發(fā)送的請求需要使用“withCredentials”來帶上cookie,如果一個目標域設(shè)置成了允許任意域的跨域請求赤嚼,這個請求又帶著cookie的話旷赖,這個請求是不合法的。(就是如果需要實現(xiàn)帶cookie的跨域請求更卒,需要明確的配置允許來源的域等孵,使用任意域的配置是不合法的)瀏覽器會屏蔽掉返回的結(jié)果。javascript就沒法獲取返回的數(shù)據(jù)了蹂空。這是cors模型最后一道防線俯萌。假如沒有這個限制的話果录,那么javascript就可以獲取返回數(shù)據(jù)中的csrf token,以及各種敏感數(shù)據(jù)咐熙。這個限制極大的降低了cors的風險弱恒。

四、攻擊模型

Paste_Image.png

從思路上講糖声,有兩種類型的攻擊方式斤彼。一種是在攻擊者自己控制的網(wǎng)頁上嵌入跨域請求,用戶訪問鏈接蘸泻,執(zhí)行了跨域請求琉苇,從而攻擊目標,比如訪問了內(nèi)網(wǎng)敏感資源悦施。還有一種是正常的網(wǎng)頁被嵌入了到攻擊者控制頁面的跨域請求并扇,從而劫持用戶的會話。

從思路上講抡诞,有兩種類型的攻擊方式穷蛹。一種是在攻擊者自己控制的網(wǎng)頁上嵌入跨域請求,用戶訪問鏈接昼汗,執(zhí)行了跨域請求肴熏,從而攻擊目標,比如訪問了內(nèi)網(wǎng)敏感資源顷窒。還有一種是正常的網(wǎng)頁被嵌入了到攻擊者控制頁面的跨域請求蛙吏,從而劫持用戶的會話。

五鞋吉、攻擊場景

先看第一種思路的攻擊場景:

1,復雜csrf鸦做。傳統(tǒng)的csrf都是利用html標簽和表單來發(fā)送請求。沒有辦法實現(xiàn)一些復雜步驟的csrf谓着,比如模擬購物泼诱,先加購物車,結(jié)算赊锚,填寫信息治筒,等等。比如上傳文件改抡。具體可以參考利用csrf上傳文件

2,訪問內(nèi)網(wǎng)敏感資源矢炼。這個在一定的條件下是可以實現(xiàn)的。比如內(nèi)網(wǎng)的服務器配置了

Access-Control-Allow-Origin: * 允許任何來自任意域的跨域請求

用戶訪問惡意網(wǎng)頁的時候阿纤,執(zhí)行了到內(nèi)網(wǎng)服務器192.168.1.123/password.txt的請求,腳本在接收到服務器返回之后夷陋,將內(nèi)容發(fā)送到攻擊者的服務器上欠拾。

第二種思路的場景:

1,交互式xss胰锌。參考揭密HTML5帶來的攻擊手法中講到的shell of the future工具。通過cors藐窄,繞過一些反會話劫持的方法资昧,如HTTP-Only限制的cookie,綁定IP地址的會話ID等荆忍,劫持用戶會話格带。

2,程序猿在寫ajax請求的時候,對目標域限制不嚴刹枉。有點類似于url跳轉(zhuǎn)叽唱。facebook出現(xiàn)過這樣一個案例。javascript通過url里的參數(shù)進行ajax請求微宝。通過控制這個參數(shù)實現(xiàn)注入攻擊棺亭。

Paste_Image.png

原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蟋软,隨后出現(xiàn)的幾起案子镶摘,更是在濱河造成了極大的恐慌,老刑警劉巖岳守,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凄敢,死亡現(xiàn)場離奇詭異,居然都是意外死亡湿痢,警方通過查閱死者的電腦和手機涝缝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒙袍,“玉大人俊卤,你說我怎么就攤上這事『Ψ” “怎么了消恍?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長以现。 經(jīng)常有香客問我狠怨,道長,這世上最難降的妖魔是什么邑遏? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任佣赖,我火速辦了婚禮,結(jié)果婚禮上记盒,老公的妹妹穿的比我還像新娘憎蛤。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布俩檬。 她就那樣靜靜地躺著萎胰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棚辽。 梳的紋絲不亂的頭發(fā)上技竟,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音屈藐,去河邊找鬼榔组。 笑死,一個胖子當著我的面吹牛联逻,可吹牛的內(nèi)容都是我干的搓扯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遣妥,長吁一口氣:“原來是場噩夢啊……” “哼擅编!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箫踩,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爱态,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后境钟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦担,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年慨削,在試婚紗的時候發(fā)現(xiàn)自己被綠了洞渔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缚态,死狀恐怖磁椒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玫芦,我是刑警寧澤浆熔,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站桥帆,受9級特大地震影響医增,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜老虫,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一叶骨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祈匙,春花似錦忽刽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宝剖。三九已至洁闰,卻和暖如春歉甚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扑眉。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工纸泄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腰素。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓聘裁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弓千。 傳聞我的和親對象是個殘疾皇子衡便,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容