VNCTF2022公开赛

2023-12-05 15:08
文章标签 公开赛 vnctf2022

本文主要是介绍VNCTF2022公开赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GameV4.0

耐心
在这里插入图片描述

在这里插入图片描述

gocalc0

00x1非预期解

点击
在这里插入图片描述
在这里插入图片描述

把session拿去解码一下(末尾有==base64解码一下)
在这里插入图片描述
在这里插入图片描述
两次编码就出来了(本来我以为)
在这里插入图片描述

00x2预期解

此方法不大清楚
讲解处

package mainimport (_ "embed""fmt""os""github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin"
)func main() {port := os.Getenv("PORT")if port == "" {port = "8088"}r := gin.Default()store := cookie.NewStore([]byte("woW_you-g0t_sourcE_co6e"))r.Use(sessions.Sessions("session", store))r.GET("/flag", func(c *gin.Context) {session := sessions.Default(c)c.String(200, session.Get("FLAG").(string))})r.Run(fmt.Sprintf(":%s", port))
}

newcalc0

原型链污染:

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

我们可以认为原型prototype是类Foo的一个属性,而所有用Foo类实例化的对象,都将拥有这个属性中的所有内容,包括变量和方法。比如上图中的foo对象,其天生就具有foo.show()方法。

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

一个Foo类实例化出来的foo对象,可以通过foo.__proto__属性来访问Foo类的原型,也就是说:

foo.__proto__ == Foo.prototype

总结:
1、prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法
2、一个对象的__proto__属性,指向这个对象所在的类的prototype属性
并且:
所有类对象在实例化的时候将会拥有prototype中的属性和方法

而原型链污染就是通过对prototype的改变,控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象。
详细讲解

源码:
const express = require("express");//require用于从外部获取一个模块的接口
const path = require("path");
const vm2 = require("vm2");const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());app.use(express.static("static"));const vm = new vm2.NodeVM();//VM 模块是 NodeJS 里面的核心模块,支撑了 require 方法和 NodeJS 的运行机制app.use("/eval", (req, res) => {const e = req.body.e;//req.body通常用来解析POST请求中的数据//这里的e获取输入框中的内容if (!e) {//如果不存在则向模板写入一个数据wrongres.send("wrong?");return;}try {res.send(vm.run("module.exports="+e)?.toString() ?? "no");//module.exports把一个对象封装到模块中,这样在其他的文件中就可以以调用模块的方式调用它} catch (e) {console.log(e)res.send("wrong?");//向模板发送数据}
});//console.table([{a:1}],['__proto__'])app.use("/flag", (req, res) => {if(Object.keys(Object.prototype).length > 0) {//Object.keys方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。//这边是要object类的属性个数要大于0Object.keys(Object.prototype).forEach(k => delete Object.prototype[k]);//k为键名,删除属性的值res.send(process.env.FLAG);// process.env属性返回包含用户环境的对象} else {res.send(Object.keys(Object.prototype));}
})app.use("/source", (req, res) => {let p = req.query.path || "/src/index.js";p = path.join(path.resolve("."), path.resolve(p));console.log(p);res.sendFile(p);
});app.use((err, req, res, next) => {console.log(err)res.redirect("index.html");
});app.listen(process.env.PORT || 8888);

payload:

console.table([{a:1}],['__proto__'])
console.table(data, properties);参数:该方法接受上述和以下所述的两个参数:
data:表格数据。每行数据的数组,其中包含该特定行的每一列的值。
properties:它指定用于构造表的属性。此方法不会返回任何内容,但会打印构造的表并记录下来。如果无法将参数解析到表中,则仅记录参数。
使用 console.table 方法将它以一个漂亮的表格的形式打印出来。会根据数组中包含的对象的所有属性

console.table源码:

// tabularData 是第一个参数 [{a:1}]
// properties 是第二个参数 ["__proto__"]
const map = ObjectCreate(null);
//ObjectCreate创建新对象,第一个参数是要继承的原型,这里没有要继承的原型
let hasPrimitives = false;
const valuesKeyArray = [];
const indexKeyArray = ObjectKeys(tabularData);//表格数据,也就是[{a:1}]for (; i < indexKeyArray.length; i++) {const item = tabularData[indexKeyArray[i]];const primitive = item === null ||(typeof item !== 'function' && typeof item !== 'object');if (properties === undefined && primitive) {//因为我们的properties键名设置了,所以properties !== undefinedhasPrimitives = true;valuesKeyArray[i] = _inspect(item);} else {const keys = properties || ObjectKeys(item);//key 是 __proto__ for (const key of keys) {if (map[key] === undefined)map[key] = [];// !ObjectPrototypeHasOwnProperty(item, key) 成立if ((primitive && properties) ||!ObjectPrototypeHasOwnProperty(item, key))// 因此 map[__proto__][0] 是空字串map[key][i] = '';elsemap[key][i] = _inspect(item[key]);}}
}

这篇关于VNCTF2022公开赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

2月公开赛Web-ssrfme

考点: redis未授权访问 源码: <?phphighlight_file(__file__);function curl($url){ $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch

LitCTF 2024(公开赛道)——WP

目录 Misc 涐贪恋和伱、甾―⑺dé毎兮毎秒 你说得对,但__ 盯帧珍珠 Everywhere We Go 关键,太关键了! 女装照流量 原铁,启动! 舔到最后应有尽有 The love Web exx 一个....池子? SAS - Serializing Authentication System 浏览器也能套娃? 高亮主题(划掉)背景查看器 百万美元的

2011阿里巴巴程序设计公开赛 / 1004 Level up

比赛完玩了一天游戏(颓~) 看到有人要这题的标程,贴一下吧(除了会贴标程你还会干吗~)~ //----------------- 类型:线段树 标程: #include <cstring>#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <string>

2011阿里巴巴程序设计公开赛 / 解题报告 8.18

老规矩,先开坑。。 题目链接    hh牛总结 Pro.ID Title Ratio(Accepted / Submitted) 1001 Coin Game 26.60%(498/1872) 1002 Fruit Ninja 43.46%(352/810) 1003 I'll play a trick on you 28.36%(731/2578) 1004 Level up 2.69

2011阿里巴巴程序设计公开赛 / 1003 I'll play a trick on you

比较狗血。。。。 就是把两个数的每位都加起来,得到第三个数。 NobsNumberTreePrintPlay 代码: 略。

2011阿里巴巴程序设计公开赛 / 1001 Coin Game

博弈。暂略。 代码: #include<cstdio>#include<iostream>using namespace std;int main(){int t;int a,b;scanf("%d",&t);for(int i=1; i<=t; i++){scanf("%d %d",&a,&b);if(b==1){if(a%2==0){printf("Case %d: sec

2023 年江苏省职业院校技能大赛(中职)网络搭建与应用赛项公开赛卷——技能要求

2023 年江苏省职业院校技能大赛(中职)网络搭建与应用赛项公开赛卷——技能要求 2023 年江苏省职业院校技能大赛(中职) 网络搭建与应用赛项公开赛卷——技能要求 竞赛说明 1. 竞赛内容分布 “网络搭建与应用”竞赛共分五个部分,其中: 第一部分:网络组建与配置( 350 分) 第二部分:云平台配置( 50 分)

第三届首都高校“青春智慧”新铁人三项公开赛圆满落幕

12月2日上午,在北京大学五四体育馆,一声发令枪响,第三届首都高校“青春智慧”新铁人三项公开赛暨2023年北京大学智慧铁人三项公开赛正式开跑。 12月2日上午9时发令枪响,大赛正式开始   智慧铁人 领跑未来    此次比赛由北京市铁人三项运动协会、北京大学体育运动委员会主办,北京大学体育教研部承办,北京市大学生体育协会铁人三项运动分会协办,北京大学体育文化指导中心、北京大学

2011百校联动“菜鸟杯”程序设计公开赛Magic Potion

这一题是个位运算题,可怜我理解能力太差,,,好大一会才明白,,,也算是个枚举题吧,,, #include<iostream>#include<string.h>using namespace std;int main(){ int n;cin>>n;while(n--){ int m=0,p=0,i,j;int y[9],x[9];cin>>y[1]>>y[2]>>y[3]>

2011百校联动“菜鸟杯”程序设计公开赛Flip Game

开两个数组,一个表示行一个表示列,记录对行和列的翻转次数,最后统一扫描,,如果一开始是b经过奇数次翻转后变为w,如果一开始是w,经过偶数次翻转为w。。。。 AC代码: #include<iostream>#include<string.h>#include<string>#define N 1005using namespace std;char a[N][N];int row[