8.8 Windows FindFirstFile利用

目前大多数程序都会对上传的文件名加入时间戳等字符再进行MD5,然后下载文件的时候通过保存在数据库里的文件ID读取出文件路径,一样也实现了文件下载,这样我们就无法直接得到我们上传的webshell文件路径,但是当在Windows下时,我们只需要知道文件所在目录,然后利用Windows的特性就可以访问到文件,这是因为Windows在搜索文件的时候使用到了FindFirstFile这一个winapi函数,该函数到一个文件夹(包括子文件夹)去搜索指定文件。

利用方法很简单,我们只要将文件名不可知部分之后的字符用“<”或者“>”代替即可,不过要注意的一点是,只使用一个“<”或者“>”则只能代表一个字符,如果文件名是12345或者更长,这时候请求“1<”或者“1>”都是访问不到文件的,需要“1<<”才能访问到,代表继续往下搜索,有点像Windows的短文件名,这样我们还可以通过这个方式来爆破目录文件了。我们来做个简单的测试,测试代码如下:


//1.php

<
php

include
$_GET['file'] );

再在同目录下新建一个文件名为“123456.txt”的文件,内容为phpinfo()函数,请求/1.php?file=1<<即可包含,效果如图8-12所示。

图 8-12

通过上面的截图我们可以看到成功包含了123456.txt文件。

这里我们要想,什么情况下才能利用这个特性?目前所有PHP版本都可用,PHP并没有在语言层面禁止使用>、<这些特殊字符,在函数层面来讲,这个特性并不是只有include()、require()这些文件包含函数或者file_get_contents()这类文件读取函数才可用,事实上还有很多个函数也一样是可用这个特性的,参见表8-2。

表 8-2