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);
}
經過測試發現這個函數可以把帶/的目錄給改回來。
總結:通過這測測試,雖然這個漏洞有可能造成破壞,但并非所說的那麼恐怖。