Node.js is Web Scale

embedded/2024/11/18 21:12:00/

点击“打开/下载题目”进去看看情况:

为了方便查看翻译成中文简体来看:


emmm,看不懂什么意思,查看源代码,js表示是一段JavaScript代码,丢给AI分析一下:

// server.js
const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
const { execSync } = require("child_process");const app = express();
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, "public")));let cmds = {getsource: "cat server.js",test: "echo 'hello, world!'",
};let store = {};// GET /api/store - Retrieve the current KV store
app.get("/api/store", (req, res) => {res.json(store);
});// POST /set - Set a key-value pair in the store
app.post("/set", (req, res) => {const { key, value } = req.body;const keys = key.split(".");let current = store;for (let i = 0; i < keys.length - 1; i++) {const key = keys[i];if (!current[key]) {current[key] = {};}current = current[key];}// Set the value at the last keycurrent[keys[keys.length - 1]] = value;res.json({ message: "OK" });
});// GET /get - Get a key-value pair in the store
app.get("/get", (req, res) => {const key = req.query.key;const keys = key.split(".");let current = store;for (let i = 0; i < keys.length; i++) {const key = keys[i];if (current[key] === undefined) {res.json({ message: "Not exists." });return;}current = current[key];}res.json({ message: current });
});// GET /execute - Run commands which are constant and obviously safe.
app.get("/execute", (req, res) => {const key = req.query.cmd;const cmd = cmds[key];res.setHeader("content-type", "text/plain");res.send(execSync(cmd).toString());
});app.get("*", (req, res) => {res.sendFile(path.join(__dirname, "public", "index.html"));
});// Start the server
const PORT = 3000;
app.listen(PORT, () => {console.log(`KV Service is running on port ${PORT}`);
});

这段代码实现了一个简单的键值对存储服务(KV Store)和一个命令执行功能:

1. 引入依赖

express: 用于创建Web服务器。

body-parser: 用于解析HTTP请求体中的JSON数据。

path: 用于处理文件路径。

child_process.execSync: 用于同步执行系统命令。


2. 初始化应用

创建Express应用实例。

使用bodyParser.json()中间件来解析JSON格式的请求体。

设置静态文件目录为public,这样可以访问放在public目录下的静态文件。


3. 定义命令

cmds对象定义了一些安全的命令及其对应的系统命令字符串。例如:

getsource: 获取server.js文件的内容。

test: 输出hello, world!。


4. 键值对存储功能

GET /api/store: 返回当前键值对存储的内容。


POST /set: 设置一个键值对。支持嵌套键,例如a.b.c。

解析请求体中的key和value。

使用递归的方式在store对象中创建嵌套结构并设置值。


GET /get: 获取一个键值对。

解析查询参数中的key。

按照.分割键,逐层查找store对象中的值。

如果键不存在,返回Not exists.;否则返回对应的值。


5. 命令执行功能

GET /execute: 执行预定义的安全命令。

解析查询参数中的cmd。

从cmds对象中获取对应的命令字符串。

使用execSync同步执行命令,并将结果以纯文本形式返回。


6. 路由处理

GET /*: 处理所有其他路由请求,返回public目录下的index.html文件。


7. 启动服务器

监听端口3000,并在控制台输出启动信息。


回顾一下关键代码部分:

说明会直接执行预定义的命令“cat server.js”


这下思路有了,只要想办法修改预定义的命令为cat /flag就行了

此处,我先学会儿原型链污染的知识,再回来解释


将key设置为__proto__.nanyuan,value设置为cat /flag

成功解析cat /flag


访问/execute?cmd=nanyuan,页面发生变化,并显示出flag:

成功得到flag


http://www.ppmy.cn/embedded/138623.html

相关文章

【Linux:epoll】

目录 epoll与select、poll的区别&#xff1a; epoll操作函数&#xff1a; int epoll_create(int size); epoll_ctl: epoll_wait: epoll与select、poll的区别&#xff1a; select,poll底层是一个线性表的结构&#xff0c;而epoll是一个红黑树结构。epoll、poll不能跨平台…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

【Qt】QtCreator安装安卓环境

1、简述 在QtCreator中安装安卓开发环境的步骤: 安装java安装安卓SDK安装android_openssl(非必须)2、安装java 2.1 版本要求 本人QtCreator版本为:Qt Creator 10.0.1;Qt版本为6.5 尝试java23,编译时失败; 尝试java19,编译成功; 未尝试java17(这个版本是长期支持版…

Executor和Service

Executor和Service是Android开发中两个重要的概念&#xff0c;它们都用于处理后台任务&#xff0c;但有着不同的用途和特点。让我们来详细比较一下&#xff1a; 1. Executor&#xff08;执行器&#xff09;&#xff1a; 定义&#xff1a;Executor是一个接口&#xff0c;用于管…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…

【计算机网络】TCP网络程序

一、服务端 1.tcpServer.hpp 此文件负责实现一个tcp服务器 #pragma once #include <iostream> #include <string> #include <cstring> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…

SQL注入注入方式(大纲)

SQL注入注入方式&#xff08;大纲&#xff09; 常规注入 通常没有任何过滤&#xff0c;直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理&#xff1a; 设置MySQL时错误配置…