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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论