在挖某CMS漏洞的时候,挖到了一个API函数可以删除文件,想着可以调用这个API来删除install.lock文件,进行初始化,进管理员后台再getshell。
但是遇到了一个问题,调用这个API的时候,我传入的是绝对路径的话,文件是可以删除掉的,但是如果我传入了一个相对路径的话,却无法删除那个文件。
我一度以为是我写错了文件的路径。
经过检查,最后发现了原来是没有注意到是应该采用活动目录来构造目录。

举个例子:

假设有那么个文件目录结构:

src/A.php
    |
    |dir2/subdir/B.php
    |
    |dir3/flag.txt

A代码:

<?php
define('SITE_PATH', getcwd() . '/');
require SITE_PATH . 'dir2/subdir/B.php';

B代码:

<?php
@unlink($_GET['FilePath']);
echo "\r\ndelete ." . $_GET['FilePath'];

假设我们想要删除flag.txt这个文件路径到底应该是什么呢?

一般我们都会想../../dir3/flag.txt这个来删除,因为会想unlink函数在B.php里面,肯定是以B.php为基点,再运用相对路径去删除文件,实际上的话这是不对的。

里面涉及到当前工作目录和是当前文件目录的区别,当前工作目录可以使用getcwd()函数来获取,而当前文件目录就不多解释了,上面的代码应该用当前文件目录去删除。

所以上面的代码应该使用A.php?FilePath=dir3/flag.txt去删除,而不应该使用../../dir3/flag.txt去删除。