前言
一天一道ctf,不知道欠了几天的了,管它的,在车上看到了一道题,感觉好厉害,没遇到过,这里学习学习,参考博主https://blog.csdn.net/qq_44640313
解题
c,博主讲得太好了,直接当搬运工
一个上传文件的页面
发现无论怎么上传,根据它的提示改了上传,还是显示这样
具体源码分析:
<?php
error_reporting(0);
highlight_file(__FILE__);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
//创建了一个文件信息对象finfo,用于获取文件的MIME
类型信息。FILEINFO_MIME_TYPE是一个常量,表示获
取MIME类型。
if (finfo_file($finfo,$_FILES["file"]
["temp_name"]) === 'application/zip'){
exec('cd /tmp && unzip -o' .
$_FILES["file"]["tmp_name"]);
//检查文件的MIME类型。如果上传的文件是ZIP文
件(MIME类型为application/zip),则将其解压缩到
服务器的/tmp目录,并且覆盖原文件。
};
后面知道有这样操作:当解压操作可以覆盖上一次解压文件就可以造成任意文件上传漏洞。此题上传的文件被保存到了/tmp目录下,而且没有require和include这种文件包含的点,因此无法直接执行上传文件里面的代码,因此这里考虑利用软连接,进行目录穿越,将文件上传到任意目录
软连接是linux中一个常用命令, 它的功能是为某一个
文件在另外一个位置建立一个同步的链接。软连接类似
与c语言中的指针,传递的是文件的地址; 更形象一
些,软连接类似于WINDOWS系统中的快捷方式。 例
如,在a文件夹下存在一个文件hello,如果在b文件夹
下也需要访问hello文件,那么一个做法就是把hello复
制到b文件夹下,另一个做法就是在b文件夹下建立
hello的软连接。通过软连接,就不需要复制文件了,相
当于文件只有一份,但在两个文件夹下都可以访问。
可以考虑软连接进行目录穿越的几个特征:
有文件上传接口,但是上传文件的目录不能确定
可以上传zip文件并且会将文件解压到上传目录下
可以getshell的文件可以绕过waf成功上传
此题符合几个特征,因此可以尝试此方法
先创建构造一个指向/var/www/html目录的软链接,因为html目录下是web环境,为了后续可以getshell
打包到到1.zip,对link文件进行压缩。
zip --symlinks,是在zip压缩文件中,包含符号链接
本身,而不是它们指向的实际文件或目录,也就是说当
解压缩这个zip文件,将得到符号链接,而不是它们指向
的实际文件
接着构造第二个压缩包2.zip
创建一个link目录(因为上一个压缩包里边目录就是link),
在link目录下写一个shell.php文件,文件中写入木马文
件,这里先写入phpinfo()进行测试
我们将1.zip 上传,压缩包会被解压
这时解压文件后是软连接就会实现从tmp指向var/www/html
再上传2.zip
因为解压后的目录同名所以会覆盖原指定目录
所以此时目录是var/www/html/cmd.php
当我们上传第二个压缩包时会覆盖上一个link目录,但是
link目录软链接指向/var/www/html解压的时候会把
shell.php放在/var/www/html下,此时我们就达到了
getsehll的目的。