[NSSCTF]prize_p2

news/2024/10/18 23:25:00/

题目

打开是一段js代码

javascript">// 导入所需的模块
const { randomBytes } = require('crypto'); // 导入 crypto 模块,用于生成随机字节
const express = require('express'); // 导入 Express.js 模块,用于构建 Web 应用程序
const fs = require('fs'); // 导入文件系统模块,用于文件操作// flag.txt 文件的路径
const fp = '/app/src/flag.txt';// 创建 Express 应用程序
const app = express();// 用于存储 flag 数据的缓冲区
const flag = Buffer(255);// 以只读模式打开 flag.txt 文件
const a = fs.open(fp, 'r', (err, fd) => {// 将文件的前 44 个字节读取到 flag 缓冲区中fs.read(fd, flag, 0, 44, 0, () => {// 读取完文件内容后,删除 flag.txt 文件fs.rm(fp, () => {});});
});// 根路径的路由
app.get('/', function (req, res) {// 以文本/javascript;charset=utf-8 格式发送此文件的内容作为响应res.set('Content-Type', 'text/javascript;charset=utf-8');res.send(fs.readFileSync(__filename));
});// 获取 flag 提示的路由
app.get('/hint', function (req, res) {// 根据随机数发送 flag 缓冲区的一个片段作为提示res.send(flag.toString().slice(0, randomBytes(1)[0] % 32));
});// 获取 flag 的路由
app.get('/getflag', function (req, res) {res.set('Content-Type', 'text/javascript;charset=utf-8');try {let a = req.query.a;// 检查提供的值是否与随机生成的值匹配if (a === randomBytes(3).toString()) {// 如果匹配,作为响应发送指定文件的内容res.send(fs.readFileSync(req.query.b));} else {// 如果不匹配,在一定时间延迟后发送指定文件的内容(如果未提供延迟时间,默认为一天)const t = setTimeout(() => {res.send(fs.readFileSync(req.query.b));}, parseInt(req.query.c) ? Math.max(86400 * 1000, parseInt(req.query.c)) : 86400 * 1000);}} catch {// 捕获任何错误并发送问号作为响应res.send('?');}
});// 启动服务器监听 80 端口
app.listen(80, '0.0.0.0', () => {console.log('开始监听');
});

代码分析

先问g大哥 简单知道代码表达的意思

这是一段Express.js 服务器

所谓提供不同路由就是说

路由是用于定义应用程序如何响应客户端发起的不同 HTTP 请求的机制。换句话说,路由决定了当用户访问特定的 URL 时,服务器应该做出什么样的响应。

Express.js 允许开发人员使用 app.get()app.post()app.put()app.delete() 等方法来定义不同类型的路由。其中,app.get() 用于处理 HTTP GET 请求,app.post() 用于处理 HTTP POST 请求,依此类推。

例如,本题代码中,我们可以看到以下几个不同的路由:

根路径路由:

app.get('/', function (req, res) { res.set('Content-Type', 'text/javascript;charset=utf-8'); res.send(fs.readFileSync(__filename)); });

这个路由处理了根路径 '/' 的 GET 请求,当用户访问根路径时,服务器会发送当前文件的内容作为响应。

提示路由:

app.get('/hint', function (req, res) { res.send(flag.toString().slice(0, randomBytes(1)[0] % 32)); });

这个路由处理了 /hint 路径的 GET 请求,当用户访问 /hint 路径时,服务器会发送 flag 的一个片段作为提示。

分析到这里 火速去看一下hint

得到片段flag

多试几次 但是最多显示的字符是32个

所以本题的关键是在这里setTimeout(()

也就是说

要传a的值要符合随机生成的三位数

b的值是flag的路径

c的值决定延迟时间 在86400 * 1000之间取大,也就是说如果a的值不匹配至少延迟一天

所以我们这里先查询一下这个setTimeout()函数的绕过

解题思路

还真的找到绕过方式

看这个函数的官方文档setTimeout(callback, delay[, ...args]) | Node.js API 文档

那么我们传参c大于2147483647即可绕过

然后我试了一下

javascript">/getflag?a=111&b=/app/src/flag.txt&c=2147483648

发现不行

重返代码看看

原来这里把flag.txt文件删掉了

那怎么绕过呢

看了别人的wp

原来可以用文件描述符就是proc这个目录

之前也接触过

但是没有完全理解

现在再来学习一下

滑动验证页面

一、文件描述符概念

  Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

这里引用一下

我理解是打开一个文件就会创建一个进程,就会返回一个文件描述符,而这个文件描述符就指向这个打开的文件。很巧的是这题打开了flag.txt却没有关闭,我们可以通过文件描述符来获取到被删除文件的内容。linux的/proc目录是一个伪文件系统,linux一切皆文件,linux常见的进程也要变成文件存储在/proc目录下。在/proc目录下有很多以数字为名字的文件夹,就是进程运行时对应的进程号,而在这些文件夹下有一个fd文件夹,用于存放这个进程所拥有的文件描述符(数字)

之前就学过self文件

也就是说

/app/src/flag.txt 文件被 open() 打开,但最终没有关闭,虽然删除了该文件,但在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容。/proc/self/fd 这个目录里包含了进程打开文件的情况,目录里面有一堆/proc/self/fd/id文件,id就是进程记录的打开文件的文件描述符的序号。id可爆破猜测获得。

我这里爆了一下 好像把服务器爆宕了 (看别的wp这么说的)

最后得到18

payload:

/getflag?a=111&b=/proc/self/fd/18&c=2147483648


http://www.ppmy.cn/news/1452636.html

相关文章

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

Element UI 简介

Element UI是一个基于Vue.js的组件库,提供了一套丰富的可复用的组件,包括按钮、表单、弹框、表格、菜单等等。它的设计风格简洁大方,易于使用,能够帮助开发者快速构建现代化的Web应用。 在Element UI中,有许多常用的组…

白话NLP技术的演进发展

自然语言处理是人工智能的一个重要分支,旨在让计算机能够理解、生成和处理人类语言。我们每天都在使用自然语言,比如与人对话、阅读文章、撰写邮件等。NLP的目标就是要让机器也能像人一样处理语言,从而实现人机交互、信息检索、机器翻译、情感分析等多种应用。 要让机器理解自…

华为LTC线索与回款中的线索培育工具:9格构想

在《LTC与铁三角∶从线索到回款-人民邮电.》一书中,说到线索的管理,书中的9格构想不错,收藏之: 九格构想这一工具的使用顺序依次是诊断原因、探究 影响、构想能力。 1. 诊断原因( R1-R2-R3 ) 企业应先用…

实操——使用uploadify插件(php版和Java版) 与 Dropzone.js插件分别实现附件上传

实操——使用uploadify插件(php版和Java版)与 Dropzone.js插件分别实现附件上传 1. 使用uploadify插件上传1.1 简介1.1.1 简介1.1.2 参考GitHub 1.2 后端PHP版本的uploadify1.2.1 下载项目的目录结构1.2.2 测试看界面效果1.2.3 附页面代码 和 PHP代码 1.…

哪些是最好用的AI工具?

你用过最好用的AI工具有哪些? 简介:探讨人们在使用AI工具时,最喜欢的和认为最好用的工具是哪些,展示AI技术的实际应用和影响。 一些最好用的AI工具包括: OpenAI GPT-3: GPT-3 是当前最先进的自然语言处理…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突,需要修改tomcat的端口

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5:自然语言处理实践(情感分类) 一:实验目的与要求 1:掌握RNN、LSTM、GRU的原理。 2:学习用RNN、LSTM、GRU网络建立训练模型,并对模型进行评估。 3:学习用RNN、LSTM、GRU网络做…