天天看點

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);

   }

經過測試發現這個函數可以把帶/的目錄給改回來。

  總結:通過這測測試,雖然這個漏洞有可能造成破壞,但并非所說的那麼恐怖。