WINDOWS文件通配符分析

前言

今天看了一下PHPCMSv9逻辑漏洞导致备份文件名可猜测
和前几天看的织梦后台思路一致

利用Windows 的特性就可以访问到文件,因为Windows 在搜索文件的时候使用到了FindFirstFile 这一个winapi 函数,该函数利用在Windows上的一些奇妙特性到一个文件夹(包括子文件夹) 去搜索指定文件。

PHP语言在Windows上的一些奇妙特性:

大于号(>)相等于通配符问号(?)
小于号(<)相当于通配符星号(*)
双引号(“)相当于点字符(.)

不可避免的,就有了问题,到底是php语言的特性还是windows上的特性导致了这三个符号会被特殊改变

PHP源码调试

http://avfisher.win/archives/888

师傅的这篇文章已经从源码通过动态调试的方法解决了上面的问题
感兴趣的可以去看一下
这里我直接写一下结论
根本原因是PHP调用了Windows API里的FindFirstFileExW()或FindFirstFile()方法
该Windows API方法对于这三个字符做了特别的对待和处理
任何调用该Windows API方法的语言都有可能存在以上这个问题,比如:Python

上面是师傅原文中的结论,总结的很鞭辟入里
这里我再来补充一下我的理解
首先我们需要知道我们使用了文件操作函数,原文中使用的getimagesize函数,毫无疑问他是对文件进行操作
然后PHP的文件操作函数均调用了opendir
opendir是什么呢?
查看资料
WINDOWS文件通配符分析

这里我们利用的就是opendir(win32readdir.c)

opendir(win32readdir.c)使用了windows的FindFirstFile(API)
然后在FindFirstFile(API)中进行了如下的定义:

//  The following constants provide addition meta characters to fully
//  support the more obscure aspects of DOS wild card processing.

#define DOS_STAR        (L‘<‘)
#define DOS_QM          (L‘>‘)
#define DOS_DOT         (L‘"‘)

于是我们的这三个符号在对php文件操作时就有了特殊含义

利用和问题

目前大多数程序都会对上传的文件名加入时间戳等字符再进行MD5,然后下载文件的时候通过保存在数据库里的文件ID读取文件路径,一样也实现了文件下载,这样我们就无法直接得到我们上传的webshell文件路径,但是当在Windows下时,我们只需要知道文件所在目录,然后利用Windows的特性就可以访问到文件,这是因为Windows在搜索文件的时候使用了FindFirstFile这一个winapi函数,该函数到一个文件夹(包含子文件夹)去搜索指定文件。
利用方法很简单,我们只要将文件名不可知部分之后的字符用“<”或者“>”代替即可,不过要注意的一点是,只使用一个“<”或者“>”则只能代表一个字符,如果文件名是12345或者更长,这时候请求“1<”或者“1>”都是访问不到文件的,需要“1<<”才能访问到,代表继续往下搜索,有点像Windows的短文件名,这样我们还可以通过这个方式来爆破目录文件了。
比如前几天写的dedecms爆破后台和PHPCMSv9逻辑漏洞导致备份文件名可猜测均是利用了如下漏洞。
PHPCMSv9逻辑漏洞导致备份文件名可猜测这个漏洞很鸡肋,因为他是后台漏洞,我只能说该cms的涉及理念都是这样,你都是后台管理员了还防备你干嘛。。所以这里不再分析。

但是还有一个问题
七月火师傅提到了实际测试中用“<”或者“<<”都可以读到文件名很长的文件。和上文不符。
我也看了一下网上的文章有个说法只使用一个”<”或者”>”则只能代表一个字符,如果文件名是12345或者更长,这时候请求”1<”或者”1>”都是访问不到文件的,需要”1<<”才能访问到,代表继续往下搜索
我们测试一下一个<到底能不能访问到:
WINDOWS文件通配符分析

可以看到一个<确实能匹配到,这个和法师书上和网上大部分说法都不一致,目前我也没找到原因。。

参考

http://avfisher.win/archives/888

WINDOWS文件通配符分析

上一篇:Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API 上


下一篇:jsapi返回值需要在配置文件里面添加