天天看点

Windows文件系统漏洞之后续

                                              Windows文件系统漏洞之后续

   文件系统漏洞早在安全焦点就被人提出来了,简单点说就是可以在命令行下通过md来创建x../之类的文件夹,而且可以拷贝文件进去,通过rd来删除目录,在那文章中提到可以利用这个漏洞我们可以做很多事情,比如想访问“S”文件夹,但是没有权限的时候我们可以创建“S../”来指向“S”这样就可以跨权限浏览。而且新一代的木马程序很可能利用此漏洞把自身藏在某个“X../”目录下这样用户根本不可能发现他,就算专业级的杀毒软件也只会去杀“X”而跳过“X../”。(想具体的了解其原理,请参考那篇文章)

   在这篇文章中主要都是在命令行下创建来实现的,在windows我们平时是无法创建这个文件的,但是站在编程的角度来看?如果用程序的话,是否可以通过api函数来实现呢?下面我们来看看这个函数

BOOL CreateDirectory(

    LPCTSTR lpPathName, // 目录

    LPSECURITY_ATTRIBUTES lpSecurityAttributes  // 指向一个LPSECURITY_ATTRIBUTES结构。

   );

下面我们通过程序来测试一下。下面是用c程序的一个函数

void CreateD()

  { char FilePath[256];

   LPSECURITY_ATTRIBUTES  Lp;

   memset(FilePath, 0, sizeof(FilePath));

   strcpy(FilePath, "D://a..//");

   CreateDirectory(FilePath,NULL);

  }

我们发现可以用api函数CreateDirectory可以创建带/的目录,下面我们来看看是否可以通过api函数RemoveDirectory函数来删除目录

   BOOL RemoveDirectory(

         LPCTSTR lpPathName  // 要删除目录的地址

        );

下面写个c函数看是否可以

void RemoveD()

   {char FilePath[256];

   memset(FilePath, 0, sizeof(FilePath));

   strcpy(FilePath, "D://a..//");

   RemoveDirectory(FilePath);

   }

经过测试完全可以删除,也就是说我们可以通过程序来实现创建删除这种文件夹,当然,加入我们那些目录里面没有文件的话,出现这种情况完全可以删除,但是如果有文件的话,我们该怎么办呢?是否需要把文件全部拷贝出来再删除,有没有一种更简单的方法呢?是否可以用文件名更改的方法呢?

   windows有一个SHFileOperation函数,这个函数功能强大,可以对目录文件的删除,复制,更名等操作,

这个函数原形如下:

   WINSHELLAPI int WINAPI SHFileOperation(

           LPSHFILEOPSTRUCT lpFileOp  //指定一个LPSHFILEOPSTRUCT结构. 

   ); 

下面来测试一下是否可行,

void SHRenameD()

{

  char Path[256];

  char toPath[256];

  SHFILEOPSTRUCT sfo;

  memset(&sfo, 0, sizeof(sfo));

  memset(Path, 0, sizeof(Path));

  memset(toPath,0,sizeof(toPath));

  strcpy(Path, "D://a//");

  strcpy(toPath,"D://a..//");

  sfo.wFunc = FO_RENAME;  //带秒文件更名,

  sfo.pFrom =Path;

  sfo.pTo =toPath;

  sfo.fFlags=FOF_NOCONFIRMATION;//标志,有很多选择。

  SHFileOperation(&sfo);

}

运行结果显示这个函数可以把普通的目录该为那个带/的目录,但是很很遗憾的是反过来却没有成功,假如有人恶意修改文件夹为这种文件夹的话,岂不是豪无防范?

  我们再尝试另一个windows下的RenameFile这个函数,这个函数可以对目录和文件操作,

void ReFile()

   { char FilePath[256];

    char toPath[256];

    memset(FilePath, 0, sizeof(FilePath));

    memset(toPath,0,sizeof(toPath));

    strcpy(FilePath, "D://a..//");

    strcpy(toPath,"D://a//");

    RenameFile(FilePath, toPath);

   }

经过测试发现这个函数可以把带/的目录给改回来。

  总结:通过这测测试,虽然这个漏洞有可能造成破坏,但并非所说的那么恐怖。