2023CISCN国赛web部分复现,详细
web
(鄙人才疏学浅,如有不对还请各位大佬指教)
unzip
一:信息收集
这个是在ctfshow靶场里面复现的
然后点击进入,看到代码
这里我们解读一下代码
<?php
error_reporting(0);
highlight_file(__FILE__);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
/*这段代码的意思是,创建一个新的finfo实例,用来获取文件的信息。
finfo_open函数的第一个参数,表示要获取的文件信息的类型
比如FILEINFO_MIME_TYPE表示获取文件的MIME类型。
finfo_open函数的第二个参数是一个字符串,表示magic数据库文件的名字,
如果不指定,就会使用PHP内置的magic数据库1*/
if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){
exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]);
};
/*
这条PHP代码的意思是,如果上传的文件的MIME类型是application/zip,也就是ZIP压缩文件
,那么就在/tmp目录下解压这个文件。exec函数是用来执行外部程序的,unzip是一个解压缩工具
*/
//exec语句解析
/*
这里的语法格式是exec函数的用法。exec函数的第一个参数是要执行的命令,第二个参数是一个数组,
用来存储命令的输出结果,第三个参数是一个变量,用来存储命令的返回值。在这个例子中,只有第一
个参数是给定的,也就是’cd /tmp && unzip -o ’ . $_FILES[“file”][“tmp_name”]。这个命 (这里的.是PHP里面的字符串连接符)
令的意思是先切换到/tmp目录,然后用unzip工具解压上传的文件。unzip的-o选项是用来覆盖已经存在
的文件的。$_FILES[“file”][“tmp_name”]是一个超全局变量,用来存储上传文件在服务器上的临时文件名
*/
通过以上信息我们可以得知,存在一个exec命令,上传后的函数会被解压到temp目录
2.思路
(1)利用exec进行代码执行
思考了一下但是这里并没有我们可以直接控制利用的变量
(2)软链接
软链接是什么呢
这个其实就相当于Windows的快捷方式,当你使用这个快捷方式的时候他会指向这个快捷方式保存的内存地址,比如说你一
个游戏的快捷方式,你这个游戏很大肯定不能直接放在桌面上吧,
然后就会创建一个快捷方式当你点击这个快捷方式的时候里面就存放了这个游戏运行文件的实际地址,然后就可以玩游戏啦。 这里这个也是一个意思,第一个上传的是一个软链接,这个软链接存放在tmp目录指向的却是另一个地址如: /var/www/html,当你上传一个名字一样的文件夹时就会触发这个软链接然后触发这个软链接,相当于你点击了这个软链接,
然后这个功能就是把你的文件上传当软链接所指的目录里面,然后就可以实现远程rce了
3.利用
(1)
注意一下我这里最后一个操作把shell.php的文件名不小心改成shll.php了但是一样能使用
(2)上传
分别把两个文件上传上去
当第一个abc1.zip 文件上传成功的时候,被解压到了/temp/abc 这个位置
然后我们再上传abc2.zip文件,当这个上传成功后由于我们是一样的文件名这里就会触发软链接
然而软链接又是指向/var/www/html 这个位置的时候我们上传的第二个文件就会被解压到网站目录
(3)获取flag
先访问一下我们的文件是否上传成功
如果能访问到页面就成功上传
然后我们再使用一句话木马获取flag