前言
寫寫簡(jiǎn)單的漏洞原理小知識(shí)科普谓形,一來學(xué)習(xí)一些新的知識(shí)提升一下自己钉跷;二來鞏固復(fù)習(xí)一下已有知識(shí)吕漂,溫故知新;三來以后查閱起來也比較方便尘应。
JSONP出現(xiàn)的前因
眾所周知,為了防止不同域之間對(duì)頁(yè)面的互相涂改吼虎,于是有了同源策略犬钢。凡事都有利弊,同源策略在保護(hù)瀏覽器客戶端安全的同時(shí)限制了跨域資源的訪問思灰,跨域的數(shù)據(jù)傳輸產(chǎn)生一些不方便玷犹。于是智慧的勞動(dòng)人民想出了JSONP這種方式來進(jìn)行跨域間的數(shù)據(jù)傳遞。但也正因JSONP跨域傳輸?shù)奶刭|(zhì)洒疚,繞過了同源策略產(chǎn)生了一定的安全問題歹颓。
簡(jiǎn)單了解一下JSONP
JSON是一種數(shù)據(jù)格式,在很多語(yǔ)言里都得到了支持油湖,在一定的場(chǎng)合下為數(shù)據(jù)傳輸提供了很大的便利巍扛。而JSONP呢,全程是 JSON with Padding乏德。字面意思撤奸,在原有的JSON上填充了一些東西吠昭。以下代碼是一段JSONP的使用示例。
<body>
<script>
function callback(json) {
alert(json.username);
}
var s = document.createElement('script');
s.src = 'http://127.0.0.1/test.json';
document.body.appendChild(s);
</script>
</body>
#test.json內(nèi)容如下
callback({ username: "zhhhy" })
JSONP跨域能力的來源
根據(jù)上述例子胧瓜,可以體會(huì)到JSONP并不是種數(shù)據(jù)格式矢棚,而是為了進(jìn)行跨域傳輸?shù)囊环N特殊編碼方式。上述例子并沒有體現(xiàn)出跨域的能力府喳。先來分析一下整個(gè)程序流程蒲肋,就可以理解為什么JSONP具有跨域的超能力。
代碼很簡(jiǎn)單不難理解钝满,執(zhí)行了一段JS代碼兜粘,作用是創(chuàng)建一個(gè)<script>
標(biāo)簽,并且設(shè)置src
屬性的值為目標(biāo)文件的地址舱沧,這樣就會(huì)對(duì)目標(biāo)地址發(fā)起一次請(qǐng)求妹沙。而請(qǐng)求得到的結(jié)果則是test.json
的內(nèi)容。JS代碼中還定義了一個(gè)callback
函數(shù)熟吏。以至于返回的內(nèi)容調(diào)用了callback
函數(shù)距糖,而JSON字符串被作為參數(shù)傳入到callback
函數(shù)之中,所以就將屬性值以彈窗的方式顯示牵寺。
根據(jù)上述流程悍引,不難想到,<script>
是實(shí)現(xiàn)跨域的關(guān)鍵點(diǎn)帽氓。由于<script>
標(biāo)簽的開放性趣斤,以至于可以不遵循同源策略,類似的標(biāo)簽還有很多黎休。只要能進(jìn)行跨域浓领,也就是自己的服務(wù)器可以訪問到其他服務(wù)器里的JSON資源,達(dá)到一種信息泄露的效果势腮。
所有帶src或href屬性的標(biāo)簽以及部分其他標(biāo)簽可以跨域:
<script src="..."></script>
<img src="...">
<video src="..."></video>
<audio src="..."></audio>
<embed src="...">
<frame src="...">
<iframe src="..."></iframe>
<link rel="stylesheet" href="...">
<applet code="..."></applet>
<object data="..." ></object>
JSONP跨域劫持的危害
上文以一個(gè)小例子簡(jiǎn)單描述了JSONP的跨域能力來源母赵,還提及了JSONP可以達(dá)成信息泄露的效果义桂。仔細(xì)思考一番。個(gè)人認(rèn)為,JSONP跨域劫持是CSRF的一種特殊利用方式瓷胧。CSRF最大的特點(diǎn)就是偽裝成客戶端合法用戶進(jìn)行一些越權(quán)操作前联,比如任意創(chuàng)建管理員賬號(hào)禽作,發(fā)布文章等酗钞。其中最大的利用限制在于需要和正常用戶進(jìn)行交互,也就是誘使用戶訪問構(gòu)造好的頁(yè)面或者完成一些操作建芙。JSONP劫持也是如此没隘,而CSRF在JSONP劫持的加持下,可以繞過token
值的校驗(yàn)禁荸。P神給出了一個(gè)新浪的例子P神給出了一個(gè)新浪的例子升略。通過第一步JSONP劫持泄露出CSRF_token值微王,由于沒有驗(yàn)證Refere頭以至于CSRF攻擊成功,可以未授權(quán)發(fā)布文章品嚣。
JSONP防御
既然JSONP是CSRF的一種利用方式炕倘,那么使用CSRF的防御手段自然也就能防御。比如驗(yàn)證token值和驗(yàn)證refere頭部翰撑,如果驗(yàn)證機(jī)制處理不當(dāng)罩旋,依舊還是會(huì)出現(xiàn)一些問題】粽可考慮增加驗(yàn)證碼等中間操作涨醋,不過會(huì)降低用戶體驗(yàn)性。最主要還是增加用戶的安全意識(shí)吧逝撬,不要隨意點(diǎn)不明連接浴骂。
參考鏈接
http://www.reibang.com/p/cc6ae9ad2ce6
https://zhengbao.wang/jsonp%E5%8A%AB%E6%8C%81%E6%BC%8F%E6%B4%9E/#more
https://www.cnblogs.com/52php/p/5677775.html
https://www.secpulse.com/archives/74691.html
https://www.anquanke.com/post/id/97671