Sctf的斗地主真好玩

 

XCTF-SCTF(日常之爆零被吊打

说实话,从去年安洵杯开始我就没打过ctf了,被吊打也是常理之中

其实也不能算爆零,签到题是我交的flag

WEB-CloudDisk

这个题目,得益于马师傅手把手带才算做出来的。

【链接】Koa框架教程

这个题目提供了源码

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"}}}

img

那么,为了读取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