XCTF-SCTF(日常之爆零被吊打
说实话,从去年安洵杯开始我就没打过ctf了,被吊打也是常理之中
其实也不能算爆零,签到题是我交的flag
WEB-CloudDisk
这个题目,得益于马师傅手把手带才算做出来的。
这个题目提供了源码
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const Koa = require('koa');
const Router = require('koa-router');
const koaBody = require('koa-body');
const send = require('koa-send');
const app = new Koa();
const router = new Router();
const SECRET = "?"
app.use(koaBody({
multipart: true,
formidable: {
maxFileSize: 2000 * 1024 * 1024
}
}));
router.post('/uploadfile', async (ctx, next) => {
const file = ctx.request.body.files.file;
const reader = fs.createReadStream(file.path);
let fileId = crypto.createHash('md5').update(file.name + Date.now() + SECRET).digest("hex");
let filePath = path.join(__dirname, 'upload/') + fileId
const upStream = fs.createWriteStream(filePath);
reader.pipe(upStream)
return ctx.body = "Upload success ~, your fileId is here:" + fileId;
});
router.get('/downloadfile/:fileId', async (ctx, next) => {
let fileId = ctx.params.fileId;
ctx.attachment(fileId);
try {
await send(ctx, fileId, { root: __dirname + '/upload' });
}catch(e){
return ctx.body = "SCTF{no_such_file_~}"
}
});
router.get('/', async (ctx, next) => {
ctx.response.type = 'html';
ctx.response.body = fs.createReadStream('index.html');
});
app.use(router.routes());
app.listen(3333, () => {
console.log('This server is running at port: 3333')
})
很显然,koa-body库和上传有关,很容易被注意到,这个题目着力于上传,那么理所当然就要去找这个库有关的漏洞(我这个反应迟缓的花了很长时间才搞明白这点
https://github.com/dlau/koa-body/issues/75
github上就有一个issue,指出上传的时候用json代替上传包,就可以使得
const reader = fs.createReadStream(file.path);
这一句语句把path误认为是json里的path,在后面的步骤就会把相应的文件发送到download目录,使得文件可以被下载下来。
const file = ctx.request.body.files.file; file.path file.name 已知道有这些东西
那么我们就可以构造payload:
去除原文件头,改成单纯的post json数据的格式。
{"files":{"file":{"path":"/any/path","name":"flag"}}}
那么,为了读取flag,我们需要知道这个网站运行所在的位置。这时候马师傅提醒了我这个:/proc/self/environ
/proc/self/environ
/proc文件系统:是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 /proc/self/environ:当前正在运行的进程的环境变量列表
这样就很自然的找到了文件所在的位置,是在/app/flag
然后读取下载即可
走过的坑
一开始注意到了koa-body库,却不敢确定,其实已经找到了相应文章,但也没搞清楚原理。在kk师傅的hint下才注意到库版本低下的问题,然后开始相应研究,并没有吃透那个payload的含义(这和我js基础低下以及做CTF题太少,http理解底下有关
导致卡了八个多小时都没做出来
在马师傅帮助下我理解了那个漏洞的含义,然后才慢慢搞清楚正确方向
在找flag那里,我又卡了,甚至开始拿爆破来寻找flag(我当时突然理解为什么芋头把题给炸掉过了
走了不少弯路,最后还是爆出flag了(感动
感觉自己能力上各种方面还有严重的不足,意识也还不够,暑假冲一冲单车变摩托,看下能不能进入小组一起愉快玩耍吧
这段时间也慢慢感觉确定下来以后就做ctf了
MISC-can you hear?
丢进qsstv,秒杀
http://www.srcmini.com/62326.html