成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript原型鏈污染

開發 前端
js原型鏈污染可以說原理并不是太難懂,關鍵是實際中如何去利用。關于這個漏洞也是看了很多大神的文章,它們的思路真的太厲害了,我還有很多需要學習的,跟大家一起共勉。

前言

在瀏覽某個論壇的時候,第一次看到了JavaScript原型鏈污染漏洞。當時非常的好奇,當時我一直以為js作為一種前端語言,就算存在漏洞也是針對前端,不會危害到后端,因此我以為這種漏洞危害應該不大??僧斘铱吹剿穆┒次:€有可以執行任意命令的時候,發現可能我想到有點簡單了。js也是可以用來做后端語言的。這篇文章就來認識一下這個漏洞。

JavaScript原型鏈是什么?

既然漏洞名稱是JavaScript原型鏈污染,那么首先就要先明白JavaScript原型鏈是什么。

正如我們所知,Javascrip的復雜類型都是對象類型(Object),而js不是一門完全面對對象編程的語言。那么對于對象編程來說要考慮對象的繼承。

js實現繼承的核心就是原型鏈。我理解的就是原型鏈的存在就是js中的繼承機制,保證函數或對象中的方法,屬性可以向下傳遞。

js使用了構造函數來創建對象,如下,我們可以通過構造函數來定義一個類:

// 構造函數
function Person(name, age) {
    this.name = name;
    this.age = age;
}

// 生成實例
const p = new Person('zhangsan', 18);

1692167778_64dc6e62b659f0a4498b9.png!small?16921677793501692167778_64dc6e62b659f0a4498b9.png!small?1692167779350

可以看到這個類除了我們定義的兩個屬性以外,還有一個prototype的屬性。prototype指向函數的原型對象,這是一個顯式原型屬性,只有函數才擁有該屬性。

prototype也擁有兩個屬性:

constructor:指向原型的構造函數

prototype:指向了Object的原型

在prototype的屬性中有一個_proto_,那么這個_proto_與prototype又有什么關系?

1692167810_64dc6e826449231561148.png!small?16921678110881692167810_64dc6e826449231561148.png!small?1692167811088

原型prototype是類的一個屬性,而所有用類實例化的對象,都將擁有這個屬性中的所有內容,包括變量和方法。比如上圖中的p對象,其天生就具有類Person的屬性和方法。

我們可以通過Person.prototype來訪問Person類的原型,但Person實例化出來的對象,是不能通過prototype訪問原型的。這時候,就該__proto__登場了。

也就是類可以用prototype來訪問類的原型,而實例化的對象可以用_proto_來訪問對象所在類的prototype屬性。

總結:

其實我們只要明白一點就可以了,JavaScript原型鏈是js中實現繼承的核心,js的對象都會執行其它的原型,最后指向的原型為null。最后關于原型鏈再來總結一下

1)js是通過原型鏈來實現繼承的。

2)所有類對象在實例化的時候將會擁有prototype中的屬性和方法

3)類可以使用prototype來訪問類的原型對象,而實例化對象可以通過_proto_來訪問類的原型對象

let f = new Foo();
f.constructor === Foo;
f._proto_ === Foo.prototype
f._proto_ === Foo.prototype
Foo._proto_ === Function.prototype

原型鏈污染

在了解了原型鏈的相關知識以后,可以來看看竟然什么是原型鏈污染漏洞。

上面說過實例化對象的__proto__指向了類的prototype。那么,如果我們修改了實例化對象__proto__中的值,是不是就可以修改類中的值呢?是否可以影響所有和這個對象來自同一個類、父祖類的對象?

其實這就是原型鏈污染的原理。我們通過修改實例化對象的__proto__中的值,污染了類本體,進而影響所有和這個對象來自同一個類、父祖類的對象。

p神的博客上有一個這樣的例子,用來說明原型鏈污染:

1692167987_64dc6f332874455dd5d81.png!small?16921679878361692167987_64dc6f332874455dd5d81.png!small?1692167987836

實際情況下利用分析

在實際的情況中,我們可能只能控制部分參數,那么我們怎么才能為__proto__賦值呢?

要為__proto__賦值就要求__proto__作為變量傳進去并且作為鍵名,這種情況一般出現在下面的三種場景中:

  • 對象merge
  • 對象clone(其實內核就是將待操作的對象merge到一個空對象中)
  • 路徑查找屬性然后修改屬性的時候

下面借用p神文章中的一個例子來看看具體操作,原文鏈接為:https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html

以對象merge為例,我們想象一個簡單的merge函數:

function merge(target, source) {
    for (let key in source) {
        if (key in source && key in target) {
            merge(target[key], source[key])
        } else {
            target[key] = source[key]
        }
    }
}

在合并的過程中,存在賦值的操作target[key] = source[key],那么,這個key如果是__proto__,是不是就可以原型鏈污染呢?

let o1 = {}
let o2 = {a: 1, "__proto__": {b: 2}}
merge(o1, o2)
console.log(o1.a, o1.b)

o3 = {}
console.log(o3.b)

結果是,合并雖然成功了,但原型鏈沒有被污染:

1692168050_64dc6f7280e79c362a397.png!small?16921680511941692168050_64dc6f7280e79c362a397.png!small?1692168051194

這是因為,我們用JavaScript創建o2的過程(let o2 = {a: 1, "__proto__": {b: 2}})中,__proto__已經代表o2的原型了,此時遍歷o2的所有鍵名,你拿到的是[a, b],__proto__并不是一個key,自然也不會修改Object的原型。從下面的圖中也可以看出,在o1中,參數b并沒有出現在原型中。

1692168062_64dc6f7e3ea57daf7bf33.png!small?16921680629431692168062_64dc6f7e3ea57daf7bf33.png!small?1692168062943

那么,如何讓__proto__被認為是一個鍵名呢?

我們將代碼改成如下:

let o1 = {}
let o2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}')
merge(o1, o2)
console.log(o1.a, o1.b)

o3 = {}
console.log(o3.b)

可見,新建的o3對象,也存在b屬性,說明Object已經被污染

1692168090_64dc6f9ae493107bec1d4.png!small?16921680914831692168090_64dc6f9ae493107bec1d4.png!small?1692168091483

這是因為,JSON解析的情況下,__proto__會被認為是一個真正的“鍵名”,而不代表“原型”,所以在遍歷o2的時候會存在這個鍵。

再來看看o1發現,b屬性是定義在原型之中的。

1692168096_64dc6fa0980dab3967fd7.png!small?16921680972121692168096_64dc6fa0980dab3967fd7.png!small?1692168097212

merge操作是最常見可能控制鍵名的操作,也最能被原型鏈攻擊,很多常見的庫都存在這個問題。

js原型鏈污染漏洞分析

接下來用一個cve漏洞來具體再看一下這個漏洞。

3.4.0版本之前的jQuery存在一個原型污染漏洞CVE-2019-11358,PoC如下。

//代碼如下,如果從前端接收一個json內容,傳到后端。
//json內容:JSON.parse('{"__proto__": {"z": 123}}')

const json1 = ajax();  
jQuery.extend(true, {}, JSON.parse(json1));
console.log( "test" in {} ); // true

jQuery.extend () 函數用于將一個或多個對象的內容合并到目標對象

$.extend( [deep ], target, object1 [, objectN ] )

參數

描述

deep

可選。 Boolean類型 指示是否深度合并對象,默認為false。如果該值為true,且多個對象的某個同名屬性也都是對象,則該"屬性對象"的屬性也將進行合并。

target

Object類型 目標對象,其他對象的成員屬性將被附加到該對象上。

object1

可選。 Object類型 第一個被合并的對象。

objectN

可選。 Object類型 第N個被合并的對象。

再來看看實際的代碼是如何去寫入的。

首先下載jQuery,這里下載的是3.3.0版本

https://github.com/jquery/jquery/tree/3.3.0

在src/core.js中文件中可以找到該extend函數??催^源碼,可以發現該函數的正好符合上面說的合并數據的概念,那么來看看它到底會不會被污染?

1692168161_64dc6fe1e3ff617f47974.png!small?16921681626551692168161_64dc6fe1e3ff617f47974.png!small?1692168162655

我們來動態調試一下這個程序:

引入jQuery腳本,并設置斷點,進行調試

1692168167_64dc6fe7b978b4973c2cd.png!small?16921681683931692168167_64dc6fe7b978b4973c2cd.png!small?1692168168393

首先根據第一個參數判斷是否進行深度拷貝,然后進行第一次循環,取得參數為__proto__

1692168172_64dc6fecc462985824a7e.png!small?16921681735221692168172_64dc6fecc462985824a7e.png!small?1692168173522

第二次循環,在__proto__中去參數進行賦值

1692168177_64dc6ff18c0335618e4f2.png!small?16921681781851692168177_64dc6ff18c0335618e4f2.png!small?1692168178185

此時再看原型已經被污染了

1692168182_64dc6ff620c4ded5d0a06.png!small?16921681827161692168182_64dc6ff620c4ded5d0a06.png!small?1692168182716

總結

js原型鏈污染可以說原理并不是太難懂,關鍵是實際中如何去利用。關于這個漏洞也是看了很多大神的文章,它們的思路真的太厲害了,我還有很多需要學習的,跟大家一起共勉。

由于本人水平有限,文章中可能會出現一些錯誤,歡迎各位大佬指正,感激不盡。如果有什么好的想法也歡迎交流,謝謝大家了~~

參考鏈接

https://www.freebuf.com/articles/web/275619.html

https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html

https://xz.aliyun.com/t/7025

https://www.freebuf.com/articles/web/264966.html

本文作者:, 轉載請注明來自FreeBuf.COM

責任編輯:武曉燕 來源: FreeBuf.COM
相關推薦

2020-02-20 14:00:15

JavaScript原型原型鏈

2016-06-07 14:28:39

Javascript原型

2023-04-07 09:07:11

2017-04-07 11:15:49

原型鏈原型Javascript

2012-11-08 10:40:47

JavaScript原型鏈

2022-05-26 09:20:01

JavaScript原型原型鏈

2020-10-20 08:35:34

JS基礎進階

2021-05-10 06:11:24

前端原型鏈污染漏洞服務器shell

2016-05-06 14:02:18

JavaScript原型鏈

2024-08-09 12:44:45

JavaScript原型鏈鏈條

2012-01-05 15:07:11

JavaScript

2017-05-05 10:31:35

JavaScriptprototype__proto__

2022-03-29 09:15:55

Javascript函數屬性

2016-12-27 09:10:29

JavaScript原型鏈繼承

2011-08-31 14:48:33

JavaScript

2020-09-10 07:04:30

JSJavaScript 原型鏈

2024-06-18 08:31:33

2019-02-27 16:00:48

JS原型原型鏈對象

2024-08-27 12:36:33

2021-11-15 06:00:14

JSPanda掃描漏洞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看国产a| 久久久久亚洲精品 | 国内久久 | 久久久www | 久久久精品国产 | 在线看片福利 | 欧美亚洲日本 | 亚洲电影在线播放 | 波多野结衣一区二区 | 可以免费观看的av片 | 国产精品一区视频 | 久草视频观看 | 精品久久久久久久久久久久久久 | www网站在线观看 | 精品国产一区二区三区久久久蜜月 | 中文字幕av在线 | 成人在线播放 | 国产有码 | 国产美女在线免费观看 | 一区二区日韩 | 免费观看一级黄色录像 | 精品毛片| 亚洲精品一区二区 | av一级毛片 | 中文字幕一区二区三 | 国产精品a久久久久 | 国产精品久久久久久久毛片 | 一级片免费视频 | 精品一级 | 成人不卡 | 日本一二三区在线观看 | 亚洲免费在线观看av | 国产一区二区三区在线免费观看 | 日韩成人在线播放 | 欧美成人a∨高清免费观看 色999日韩 | 91精品久久久久久久久久入口 | 华丽的挑战在线观看 | 国产精品色 | 伊人久久麻豆 | 欧美日韩不卡 | 精品久久国产视频 |