【JavaScript 漏洞】原型污染详解

news/2024/12/31 1:13:30/文章来源:https://www.cnblogs.com/o-O-oO/p/18621080

免责声明

本号所写文章方法和工具只用于学习和交流,严禁使用文章所述内容中的方法未经许可的情况下对生产系统进行方法验证实施,发生一切问题由相关个人承担法律责任,其与本号无关。

什么是原型污染

原型污染是一种 JavaScript 漏洞,它使攻击者能够向全局对象原型添加任意属性,然后这些属性可能被用户定义的对象继承。原型污染通常无法作为一个独立的漏洞利用,但它允许攻击者控制原本无法访问的对象的属性。如果应用程序随后以不安全的方式处理攻击者控制的属性,则这可能会与其他漏洞相关联。在客户端 JavaScript 中,这通常会导致 DOM XSS,而服务器端原型污染甚至会导致远程代码执行。

在JavaScript函数以递归方式将包含用户可控制属性的对象合并到现有对象中时,如果没有先清理键,就可能出现原型污染漏洞。这是因为攻击者可以利用这个过程,注入具有特殊意义的键(如__proto__)以及任意嵌套属性。这种漏洞的存在基于JavaScript的一些特性,特别是关于对象的原型和继承机制。

JavaScript中的每个对象都链接到某种类型的另一个对象,即其原型。对象会自动继承其分配的原型的所有属性(除非它们自己已经拥有相同键的属性)。例如,字符串会自动分配内置的String.prototype ,新对象能够继承原型的属性和方法,这是正常的继承机制。然而,当在合并对象的递归操作中缺乏对键的清理时,攻击者就有了可乘之机。

例如,假设存在一个函数,它递归地合并来自用户输入的对象到一个已有的对象中。如果用户输入的对象包含了__proto__属性,这个属性就可能被误添加到目标对象的原型上,而不是作为目标对象自身的属性处理。这样一来,攻击者就能够通过污染原型来影响后续基于该原型创建的对象的行为。这可能导致一系列安全问题,如修改对象的默认行为,或者通过继承被污染的原型,使原本安全的对象变得可被攻击利用。

在JavaScript中,__proto__ 是一个对象的默认原型属性,它指向该对象的原型对象。原型对象是JavaScript中实现继承机制的关键,它允许对象共享一组公共的属性和方法。每个对象都有一个__proto__属性,通过这个属性,对象可以访问其原型对象上的所有属性和方法。

在进行对象合并(merge)操作时,如果直接将一个对象的属性复制到另一个对象上,而不考虑属性的特殊含义,就有可能引发原型污染问题。具体来说,如果源对象中包含__proto__属性,并且在合并过程中没有对其进行特殊处理,那么这个属性就会被复制到目标对象的原型上,而不是目标对象本身。这样一来,所有基于该原型创建的对象都会受到这个属性的影响,从而导致不可预见的行为。

攻击者可以利用原型污染漏洞,通过注入恶意的__proto__属性来改变对象的行为。例如,攻击者可以创建一个对象,其中__proto__属性指向一个包含有害值的对象。当这个对象被合并到目标对象时,目标对象的原型就会被污染,从而影响到所有基于该原型创建的对象。这些对象可能会以危险的方式使用被污染的属性,导致应用程序出现安全问题。

成功利用原型污染需要有原型污染源(能够使用任意属性对原型对象进行中毒的任何输入。)、接收器(允许执行任意代码的 JavaScript 函数或 DOM 元素)、可利用的小工具(未经适当筛选或清理而传递到 Sink 的任何属性。)

原型污染源是任何用户可控制的输入,可用于向原型对象添加任意属性。
最常见的来源如下:

基于JSON的输入:如果应用程序在处理JSON输入时没有进行适当的验证和清理,攻击者可以通过构造恶意的JSON数据来污染原型对象。

Web消息:应用程序在处理接收到的Web消息时没有进行适当的验证和清理,攻击者可以通过发送恶意的消息来污染原型对象。

URL参数:应用程序在处理URL参数时没有进行适当的验证和清理,攻击者可以通过构造恶意的URL参数来污染原型对象。

URL参数原型污染源

包含攻击者构造的查询字符串URL如下:

https://example.com/?__proto__[evilProperty]=payload

这里的 __proto__ 是一个特殊的属性,用于指向对象的原型。evilProperty 是攻击者希望添加或修改的属性名,payload 是攻击者希望设置的属性值。当应用程序接收到这个 URL 并解析参数时,如果没有对 __proto__ 属性进行适当的处理,就会导致原型污染。例如,如果应用程序将 URL 参数转换为一个 JavaScript 对象,那么这个对象的原型就会被添加一个名为 evilProperty 的属性,其值为 payload。

JSON 输入原型污染

JSON.parse() 方法用于将JSON字符串转换为JavaScript对象。它将JSON对象中的键视为任意字符串,包括 __proto__ 之类的内容。如果在解析JSON时,能够控制包含 " __proto__" 键值对的JSON字符串输入到JSON.parse() 中,就可能会修改对象的原型,造成原型污染。

原型污染接收器

接收器本质上只是一个JavaScript函数或DOM元素,您可以通过原型污染访问它。这使您能够执行任意JavaScript或系统命令。由于原型污染允许您控制原本无法访问的属性,因此这可能使您能够在目标应用程序中访问许多额外的sink。

原型污染小工具

“小工具”(gadget)通常指的是应用程序中可以被攻击者利用的特定代码路径或功能。由于应用程序对用户输入的处理不当而导致的。在原型污染的情况下,小工具是指那些可以被攻击者通过污染原型来访问和利用的JavaScript函数或DOM元素。

通过客户端原型污染,攻击者可以利用DOMXSS。例如,如果应用程序使用了eval()函数来处理用户输入,那么攻击者可以通过污染原型来注入恶意代码,从而执行任意JavaScript代码。

服务器端原型污染:在服务器端,攻击者可以通过污染原型来执行任意代码。例如,如果应用程序使用了for...in...循环来处理用户输入,那么攻击者可以通过污染原型来注入恶意属性,从而执行任意代码。

原创 老付话安全

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856493.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 EC Final 前集训记录

ECF23 Link C. Equal Sums 记值域为 \(w\) 并认为 \(n,m\) 同阶,直接背包的话和的值域能够达到 \(O(nw)\),统计每个答案的复杂度也是 \(O(nw)\),于是总复杂度是 \(O(n^3w)\)。 注意到最后需要维护的信息仅仅是 \(\sum x_i = \sum y_j \Leftrightarrow \sum x_i - \sum y_j =…

Wpf加入Prism框架

Prism是一个开源框架,用于在WPF、Xamarin Forms、Uno/Win UI等应用中创建松耦合、可维护、可测试的XAML应用程序。 Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的XAML应用程序 ,包括MVVM,dependency injection,commands,EventAggregator等。1…

【甲方安全】工业行业+工业无线网络技术

摘 要 工业互联网体系融合了新一代信息通信技术与工业经济,推动了工业数字化、网络化、智能化转型,其中网络体系是基础。工业无线网络作为其重要组成部分,具有灵活部署的特性,能适应复杂的工业环境,为工业互联网的构建提供基础。深入探讨了工业无线网络技术在工业互联网中…

AutoCAD VBA 模态窗口焦点丢失的终极解决办法

话不多说上代码 问题出在userform这个窗体的样式上需要用到的win32api函数以及常量Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Public Const…

数值计算方法(1) 插值方法

+++ date = 2024-12-21T10:12:41+08:00 draft = true title = 数值计算方法(1) 插值方法 +++ 初次发布于我的个人文档 之前有一期简单介绍了一下拉格朗日插值和数值积分微分方法,我感觉有点太简单了。所以这次打算开个系列,好好唠一唠。 什么是插值 在小学阶段,有一种题目叫…

Antdesign React之API展示页面

本项目基于antdesignpro,点击调试后跳转弹窗,左边展示public/doc路径下的md文档并且通过markdownview渲染成md,右侧是json编辑器index.tsx import React, { useState, useMemo } from react; import { Layout, Menu, theme, Row, Col } from antd; import { HomeOutlined, F…

时间复杂度:理解算法性能的核心指标

在编程和算法设计中,时间复杂度是一个至关重要的概念。它用来衡量一个算法在处理不同规模的输入数据时,执行所需要的时间增长速度。换句话说,时间复杂度能够帮助我们理解算法在面对大数据时的表现,是否能高效地完成任务。 什么是时间复杂度? 时间复杂度是一个描述算法效率…

TIA环境下SCL编程练习:产生m到n之间的随机整数,存入数组

假设需要读取100个随机数,存入有100个成员的数组。做这个练习是为了学习一下SCL编程。随机数使用系统时钟纳秒数来线性转换。 新建项目,选用1500PLC(6ES7 513-1AL02-0AB0,当然可以选用其它型号),设定本地时区,建立网络。 新建DB,建立变量,取消优化块的访问。 新建FC,…

大学微积分 AB 第六单元:变革的整合与积累(定积分、黎曼近似)

积分学简介 定积分简介 例子: 示例:变化的积累 1/2是面积的一半 例子:

实验六 C++

任务四: Vector.hpp:#pragma once #ifndef VECTOR_HPP #define VECTOR_HPP#include <iostream> #include <stdexcept> // 为异常类提供支持 #include <memory> // 为 std::unique_ptr 提供支持template <typename T> class Vector { private:std::…

道阻且长——2024秋软工实践个人总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 回顾自己的软工实践课程学号 102201120道阻且长——2024秋软工实践个人总结 一、学期回顾 1.1 想象与实际 开课之…

【Rive】Rive在Android上的简单应用

1 前言 ​ Rive 是一款强大的矢量图编辑器,可以设计图形、也可以制作动画。Rive 提供了矩形、圆形、三角形、多边形、星形、钢笔、文字等工具来绘制各式各样的矢量图形;提供了平移、旋转、缩放等工具对矢量图形进行各种变换;提供了骨骼、约束、时间线、状态机、过渡条件、…