Lodash原型污染漏洞原理詳解

文中涉及操作均來自靶場,切勿用于非授權滲透測試!

一、JavaScript原型鏈基礎

要理解原型污染漏洞,首先需要掌握JavaScript中原型(prototype)和原型鏈(prototype chain)的基本概念。

1.1 什么是原型

JavaScript是一種基于原型的語言,每個對象都有一個原型對象,對象以其原型為模板,從原型繼承方法和屬性。原型對象也可能擁有原型,并從中繼承方法和屬性,這種關系被稱為原型鏈。

function Person(name, age) {this.name = name;this.age = age;
}let p1 = new Person('Alice', 25);
console.log(p1);

在這個例子中,p1Person構造函數的一個實例,它擁有nameage屬性,同時還有一個__proto__屬性指向Person.prototype

原型鏈關系驗證

console.log(p1.__proto__ === Person.prototype);  // true ?

console.log(p1.__proto__.__proto__ === Object.prototype);  // true ?

console.log(p1.__proto__.__proto__.__proto__);  // null ?

原型鏈圖示

關鍵點說明

第一層:p1.__proto__ 指向 Person.prototype,這是構造函數為所有實例提供的共享原型對象

第二層:Person.prototype 本身也是一個對象,它的 __proto__ 自然指向 JavaScript 的根原型 Object.prototype

終點:所有原型鏈最終都會通過 Object.prototype.__proto__ 指向 null,這是原型鏈的終點

特別說明

在ES6中更推薦使用 Object.getPrototypeOf() 而不是直接訪問 __proto__

console.log(Object.getPrototypeOf(p1) === Person.prototype); // true

構造函數本身的 __proto__ 指向 Function.prototype(這是另一個獨立的原型鏈):

console.log(Person.__proto__ === Function.prototype); // true

1.2 所有函數都是 Function 的實例

Person 是構造函數

當你定義 function Person() {}Person 就是一個用于創建對象的構造函數。

但它同時也是一個函數對象,因此它繼承自 Function.prototype

console.log(Person.__proto__ === Function.prototype); // true

Function 自身也是構造函數

Function 是 JavaScript 內置的構造函數,用于創建所有函數(包括它自己!)。

有趣的是,Function__proto__ 也指向 Function.prototype

console.log(Function.__proto__ === Function.prototype); // true

這是 JavaScript 中唯一一個 __proto__ 指向自身 prototype 的構造函數。

1.3 Object 的構造函數角色

Object 是頂級構造函數

Object 是所有對象的基類(包括函數對象)。

普通對象(如 {}new Person())的原型鏈最終都會指向 Object.prototype

ObjectFunction 的關系

Object 本身是一個函數(構造函數),因此它也繼承自 Function.prototype

console.log(Object.__proto__ === Function.prototype); // true

Function.prototype 本身是一個對象,它的 __proto__ 又指向 Object.prototype

console.log(Function.prototype.__proto__ === Object.prototype);

1.4 完整的原型鏈關系圖

function Person() {}
const p1 = new Person();// 1. 實例的原型鏈
console.log(p1.__proto__ === Person.prototype);          // true
console.log(p1.__proto__.__proto__ === Object.prototype); // true
console.log(p1.__proto__.__proto__.__proto__ === null);   // true// 2. 構造函數的原型鏈
console.log(Person.__proto__ === Function.prototype);     // true
console.log(Function.__proto__ === Function.prototype);   // true (特殊!)
console.log(Object.__proto__ === Function.prototype);     // true// 3. 原型對象的原型鏈
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype);   // true
終極關系總結(關鍵記憶點)
對象	              __proto__ 指向	        說明
p1 (實例)	          Person.prototype	    實例指向構造函數的原型
Person (函數)	      Function.prototype	  所有函數繼承自 Function
Person.prototype	  Object.prototype	    默認構造函數的原型繼承自 Object
Function	          Function.prototype	  唯一自引用的構造函數
Object	            Function.prototype	  Object 本身是函數
Function.prototype	Object.prototype	    函數原型的父級是對象原型
Object.prototype	  null	                原型鏈的終點

二、原型污染漏洞原理

2.1 什么是原型污染

原型污染是指攻擊者通過某種手段修改JavaScript對象的原型(通常是Object.prototype),從而影響所有基于該原型的對象的行為。

在Lodash的案例中,某些函數(如defaultsDeep)未能正確處理特殊屬性(如constructor__proto__),導致攻擊者可以通過精心構造的輸入修改Object.prototype

2.2 Lodash漏洞示例

Lodash的defaultsDeep函數用于遞歸合并對象的屬性。在4.17.12之前的版本中,它存在原型污染漏洞:

 const payload = '{"constructor": {"prototype": {"vuln": true}}}';_.defaultsDeep({}, JSON.parse(payload));if({}.vuln === true) {alert('lodash 存在原型污染漏洞!');}else{console.log('no vuln!');}

2.3 解析_.defaultsDeep 為何會導致漏洞

當執行_.defaultsDeep({}, JSON.parse(payload));,遞歸地將 payload 的屬性合并到空對象 {} 中。Lodash 未對特殊屬性名(constructorprototype)做安全過濾。

執行流程:
1. 創建惡意對象
const payload = '{"constructor": {"prototype": {"vuln": true}}}';
2. _.defaultsDeep({}, JSON.parse(payload))的過程

_.defaultsDeep(object, sources) 是 Lodash 提供的一個遞歸合并方法,用于將 sources(源對象)的屬性深度合并到 object(目標對象)中,但僅當目標對象的對應屬性為 undefined 時才覆蓋。

JSON.parse(payload)解析 JSON 字符串,生成 JavaScript 對象

源對象 sources:{ constructor: { prototype: { vuln: true } } }

目標對象 object: 空對象 {}(所有屬性初始為 undefined

關鍵點:constructor.prototype 是 JavaScript 中訪問 Object.prototype 的路徑。

  1. 合并過程

檢查目標對象的 constructor 屬性 → undefined,直接合并源對象的 constructor

遞歸檢查 constructor.prototype → 目標對象無此屬性,繼續合并。

最終將 { vuln: true } 賦值到 Object.prototype(即 constructor.prototype 指向的原型對象)。

2.4 漏洞危害

原型污染可能導致多種安全問題:

屬性注入:向全局對象注入惡意屬性

拒絕服務(DoS):覆蓋關鍵方法導致應用崩潰

遠程代碼執行(RCE):在某些特定環境下可導致代碼執行

安全機制繞過:可能繞過輸入驗證或其他安全控制

## 感謝您的關注

echo "QmlsaWJpbGkgc2VhcmNoICdQZW5UZXN0M3JfWmVybGsnIGZvciBtb3JlIHZpZGVvLCBUaGFuayB5
b3UgZm9yIHlvdXIgc3VwcG9ydCEK"|base64 -d

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

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

相關文章

django 獲取當前時間 格式 YYYY-MM-DD HH:Mm:ss

在 Django 中獲取當前時間并以特定的格式顯示,你可以使用 Python 的 datetime 模塊結合 Django 的 timezone 模塊。這里有兩種主要的方法來做到這一點: 方法1:使用 datetime 和 timezone 首先,確保你已經導入了必要的模塊&#x…

k8s使用自建nfs做持久化無法控制磁盤使用大小問題處理

如題,創建的pvc并無法控制用戶實際使用多少nfs存儲,使用xfs_quota來對用戶nfs目錄做磁盤配額管理 1、需使用xfs文件系統 2、/etc/fstab掛載中開啟prjquota(項目配額) 具體操作如下 xfs_quota 使用說明/etc/fstab掛載磁盤 UUID&…

小結:Spring AOP 切點表達式

Spring AOP 切點表達式(Pointcut Expression) 一、切點表達式概述 切點表達式 是 Spring AOP 用于定義哪些方法(或連接點)需要被攔截的規則,主要基于 AspectJ 切點表達式語言。Spring AOP 僅支持方法級別的切點&#…

Linux開發工具之VsCode(Filezila、MobaXterm、Vim三合一)

文章的目的是記錄,編程過程中用到的高效工具Vscode。通過這個工具實現了Filezila、MobaXterm、Vim三個工具文件下載上傳,終端調試,文件編輯的功能,避免切換和記錄指令,效率提升100%。 Linux C到Android App開發推薦鏈接…

用idea進行數據同步

聲明對列和交換機 你需要先在yaml文件當中進行rabbitmq的相關配置 rabbitmq:host:192.168.150.101 //消息件的地址port:5672 //端口數據username:itcast //用戶名password:123321 //密碼virtual-host:/ //虛擬…

實戰:Java web應用性能分析之【異步日志:性能優化的金鑰匙】

概敘 實戰:Java web應用性能分析之【Arthas性能分析trace監控后端性能】-CSDN博客 在優化方面,可以采取以下步驟: ?性能分析工具?:使用Arthas或Async Profiler進行實時診斷,定位耗時的方法調用。這可以幫助精確找…

Puppeteer API

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】

【機器學習】Teacher-Student框架

Teacher-Student Setup是一個經典的機器學習框架,包含兩個核心角色: 教師模型 (Teacher Model): 通常是一個更大、更強、已經訓練好(或正在訓練)的模型。它對問題有很好的理解,性能優秀。它的作用是為學生提…

華為云Flexus+DeepSeek征文|體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建聯網大模型

華為云FlexusDeepSeek征文|體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建聯網大模型 什么是華為云ModelArts 華為云ModelArts ModelArts是華為云提供的全流程AI開發平臺,覆蓋從數據準備到模型部署的全生命周期管理,幫助企業和開發…

Web API 路徑設計哪家強

本文檔主要比較一下各家API的URL路徑設計,通過學習各家API的URL路徑設計,加深對 REST API 的理解,幫助我們設計出更符合 REST 風格的 API。 Google API 文檔地址:https://developers.google.com/apis-explorer/#p/ YouTube Dat…

微信小程序中的計算屬性庫-miniprogram-computed

miniprogram-computed 是一個用于微信小程序的擴展庫,它提供了計算屬性(computed)和監聽器(watch)的功能,類似于 Vue.js 中的計算屬性和監聽器。以下是使用 miniprogram-computed 的詳細步驟: …

【CSS-7】深入解析CSS偽類:從基礎到高級應用

CSS偽類是前端開發中不可或缺的強大工具,它們允許我們根據文檔樹之外的信息或簡單選擇器無法表達的狀態來樣式化元素。本文將全面探討CSS偽類的各種類型、使用場景和最佳實踐。 1. 偽類基礎概念 1.1 什么是偽類? 偽類(Pseudo-class&#x…

藍橋杯國賽訓練 day4

目錄 再創新高 藍橋大使 表演賽 次數差 再創新高 import java.math.*; import java.util.*;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t 1; // tsc.nextInt();for(int i0;i<t;i) {solve();}} p…

java 高并發設計

文章目錄 目錄 文章目錄 前言 一、通用設計 一、動靜分離 二、數據庫獨立部署 三、問題 1.高并發通用設計方法 2.高并發系統的拆分順序 二、計算資源高并發 三、網絡資源高并發 超高性能場景&#xff08;10萬 QPS&#xff09; 中小規模場景&#xff08;5萬 QPS以下&a…

docker compose搭建elk 8.6.2

環境搭建 選用版本是比較新的版本 (ELK) 8.6.2 &#xff0c;elk的環境做的還是比較好的又windows和Linux多個版本&#xff0c;并且開箱即用。本地直接下載官方軟件也是可以的。最近在學習docker compose&#xff0c;就使用這個環境搭建一下。 前置條件 安裝好docker和 docke…

Springboot3+的id字符串轉化問題

以下是純后端實現 Long/BigInteger ID 轉為 JSON 字符串 的詳細配置方案&#xff0c;基于 Spring Boot 3 和 SpringDoc (OpenAPI) 最新實踐 ? 1. 添加依賴 確保你的 pom.xml&#xff08;或 Gradle&#xff09;中包含&#xff1a; <dependency><groupId>com.fast…

C#學習第30天: 匹配模式

模式匹配&#xff08;Pattern Matching&#xff09;是 C# 中一個強大且靈活的特性&#xff0c;允許開發者以更直觀的方式檢查數據結構&#xff0c;并根據特定模式執行操作。 隨著 C# 語言版本的發展&#xff0c;模式匹配的功能越來越豐富&#xff0c;為處理復雜數據提供了極大…

SQL進階之旅 Day 29:NoSQL結合使用策略

【SQL進階之旅 Day 29】NoSQL結合使用策略 文章簡述 隨著數據量的激增和業務場景的復雜化&#xff0c;傳統關系型數據庫在某些場景下已難以滿足高性能、高擴展性和靈活數據結構的需求。NoSQL&#xff08;非關系型數據庫&#xff09;以其高可擴展性、靈活的數據模型和分布式架構…

PostgreSQL 對 IPv6 的支持情況

PostgreSQL 對 IPv6 的支持情況 PostgreSQL 全面支持 IPv6 網絡協議&#xff0c;包括連接、存儲和操作 IPv6 地址。以下是詳細說明&#xff1a; 一、網絡連接支持 1. 監聽 IPv6 連接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 監聽所有IPv4…

模板字符串使用點擊事件【VUE3】

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 項目中使用模板字符串的時候很多&#xff0c;有些時候需要再模板字符串中使用點擊事件&#xff0c;那么在模板字符串中可以使用點擊事件么&#xff1f;如果這個點擊事件需要傳參呢&#xff1f; 答案…